多个咖啡因LoadingCaches添加到Spring CaffeineCacheManager

时间:2017-06-12 19:27:27

标签: spring spring-cache caffeine

我希望将一些不同的LoadingCache添加到Spring CacheManager,但我不知道如何使用CaffeineCacheManager实现这一点。似乎只有一个加载器可以刷新内容,但是我需要为每个缓存单独加载。是否可以向Spring缓存管理器添加多个加载缓存?如果是这样,那怎么样?

CaffeineCacheManager cacheManage = new CaffeineCacheManager();

LoadingCache<String, Optional<Edition>> loadingCache1 = 
            Caffeine.newBuilder()
            .maximumSize(150)
            .refreshAfterWrite(5, TimeUnit.MINUTES)
            .build(test -> this.testRepo.find(test));

LoadingCache<String, Optional<Edition>> loadingCache2 = 
            Caffeine.newBuilder()
            .maximumSize(150)
            .refreshAfterWrite(5, TimeUnit.MINUTES)
            .build(test2 -> this.testRepo.find2(test2));

// How do I add to cache manager, and specify a name?

2 个答案:

答案 0 :(得分:13)

是的,这是可能的。由于您需要对每个缓存进行微调,因此您最好自己定义它们。回到您的示例,下一步将是:

SimpleCacheManager cacheManager = new SimpleCacheManager();
cacheManager.setCaches(Arrays.asList(
    new CaffeineCache("first", loadingCache1),
    new CaffeineCache("second", loadingCache2)));

然后你可以照常使用它,例如

@Cacheable("first")
public Foo load(String id) { ... }

如果您使用的是Spring Boot,则可以将单个缓存公开为bean(因此org.springframework.cache.Cache实现),我们会自动检测它们并为您自动创建SimpleCacheManager

请注意,此策略允许您使用不同实现的缓存抽象。 first可以是咖啡因缓存,second来自其他提供商的缓存。

答案 1 :(得分:0)

拥有这个类将允许您像往常一样使用 @Cacheable("cacheA")

@EnableCaching
@Configuration
public class CacheConfiguration {

    @Bean
    public CacheManager cacheManager() {
        CaffeineCacheManager manager = new CaffeineCacheManager();
        manager.registerCustomCache("cacheA", defaultCache());
        manager.registerCustomCache("cacheB", bigCache());
        manager.registerCustomCache("cacheC", longCache());
        // to avoid dynamic caches and be sure each name is assigned to a specific config (dynamic = false)
        // throws error when tries to use a new cache
        manager.setCacheNames(Collections.emptyList());
        return manager;
    }

    private static Cache<Object, Object> defaultCache() {
        return Caffeine.newBuilder()
                .maximumSize(1000)
                .expireAfterWrite(5, TimeUnit.MINUTES)
                .build();
    }

    private static Cache<Object, Object> bigCache() {
        return Caffeine.newBuilder()
                .maximumSize(5000)
                .expireAfterWrite(5, TimeUnit.MINUTES)
                .build();
    }

    private static Cache<Object, Object> longCache() {
        return Caffeine.newBuilder()
                .maximumSize(1000)
                .expireAfterWrite(1, TimeUnit.HOURS)
                .build();
    }
}