首页 > 解决方案 > CaffeineCacheManager() 构造函数需要 cacheName 吗?

问题描述

我有一个 MultipleCacheManager 类,如下所示:

@EnableCaching
public class MultipleCacheManagerConfig {

    @Bean
    @Primary
    public CacheManager mainCacheManager() {
        // instantiate caffeine manager and add in specifications
        CaffeineCacheManager cacheManager = new CaffeineCacheManager("example1", "example2");
        cacheManager.setCaffeine(Caffeine.newBuilder()
                .expireAfterWrite(4, TimeUnit.HOURS)
                .recordStats());
        return cacheManager;
    }

    // these are examples of alternate cache managers if another cache needs to be configured differently.

    public CacheManager alternateCaffeineManager() {
        CaffeineCacheManager cacheManager = new CaffeineCacheManager("example3");
        cacheManager.setCaffeine(Caffeine.newBuilder()
                .expireAfterWrite(1, TimeUnit.HOURS)
                .recordStats());
        return cacheManager;
    }

我是否需要在 CaffeieneCacheManager() 构造函数中实际传递我的缓存名称?只要@Cacheable有财产@Cacheable(cacheName = "example1", cacheManager = "mainCacheManager")就重要吗?缓存管理器在技术上已经连接到该名称。

标签: javaspringspring-bootcachingcaffeine-cache

解决方案


您总是可以首先在文档中找到有用的信息

public void setCacheNames(@Nullable Collection cacheNames) 指定此 CacheManager 的“静态”模式的缓存名称集。调用此方法后,缓存的数量及其名称将被固定,在运行时不会创建更多的缓存区域。

CaffeineCacheManager(String... cacheNames) 构造一个静态 CaffeineCacheManager,仅管理指定缓存名称的缓存。

如您所见,在构造函数中提供 cacheNames 意味着这个 cacheManager 将来只能处理那些 cacheNames。因此,您无法指示该 cacheManager 将来动态处理其他 cacheNames。

您仍然需要cacheNames通过批注,尽管 @Cacheable(cacheName = "example1", cacheManager = "mainCacheManager")好像您有多个使用此 cacheManager 的方法一样,这两个方法每个都有自己的 cacheName 是有意义的。

@Cacheable(cacheName = "example1", cacheManager = "mainCacheManager")
public String method1( String a) {
   ....
}


@Cacheable(cacheName = "example2", cacheManager = "mainCacheManager")
    public String method2( String b) {
       ....
}

这 2 个不同的 cacheNames 通知 cacheManager 它应该处理 2 个不同的缓存命名空间,并且注释通知 cacheManager 哪个 cacheName 与此方法相关。


推荐阅读