多个 Caffeine LoadingCaches 添加到 Spring CaffeineCacheManager

Multiple Caffeine LoadingCaches added to Spring CaffeineCacheManager

我想将几个不同的 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?

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

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

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

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

如果您正在使用 Spring 引导,您可以将单个缓存公开为 beans(因此 org.springframework.cache.Cache 实现),我们将检测它们并自动创建一个 SimpleCacheManager你.

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

拥有这个 class 将允许您像往常一样在您想要的地方使用 @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();
    }
}