13

我希望在LoadingCacheSpring 中添加几个不同的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?
4

2 回答 2

23

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

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来自另一个提供商的缓存。

于 2017-06-15T07:46:10.070 回答
1

拥有此类将允许您@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();
    }
}
于 2021-07-27T13:50:09.997 回答