【问题标题】:Is cacheName needed at CaffeineCacheManager() constructor?CaffeineCacheManager() 构造函数需要 cacheName 吗?
【发布时间】:2021-09-29 06:00:11
【问题描述】:

我有一个 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") 有关系吗?缓存管理器在技术上已经连接到该名称。

【问题讨论】:

    标签: java spring spring-boot caching caffeine-cache


    【解决方案1】:

    你总能在documentation找到有用的信息

    公共无效 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 与此方法相关。

    【讨论】:

    • 非常感谢!所以我从你那里得到的是,我可以将我的 CaffeieneCacheManager() 构造函数留空,从而使其成为动态的。然后,我可以传入@Cacheable(cacheName = "example1", cacheManager = "mainCacheManager"),它会自动将cacheName 连接到管理器?也许我误解了。总体:我只需要将 cacheName 和 cacheManager 传递给注解,而不是在构造函数上让它工作吗?
    猜你喜欢
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多