【问题标题】:How to customize expireAfterWrite for concrete cache if I use cacheBuilder?如果我使用 cacheBuilder,如何为具体缓存自定义 expireAfterWrite?
【发布时间】:2021-10-02 14:00:28
【问题描述】:

基于this answer,我尝试将自定义expireAfterWrite 用于“customCache”

所以我的配置如下所示:

@Configuration
@EnableCaching
public class CaffeineCacheConfig {

    ...

    @Bean
    public CaffeineCacheManager cacheManager(Caffeine<Object, Object> caffeineCacheBuilder) {
        CaffeineCacheManager result = new CaffeineCacheManager();
        result.setCaffeine(caffeineCacheBuilder);
        return result;
    }

    @Bean
    public Caffeine<Object, Object> caffeineCacheBuilder() {
        return Caffeine.newBuilder()
                .maximumSize(10000)
                .expireAfterWrite(60, TimeUnit.SECONDS)
                .recordStats();
    }

    @Bean
    public CaffeineCache customCache() {
        return new CaffeineCache("customCache",
                Caffeine.newBuilder()
                        .maximumSize(10000)
                        .expireAfterWrite(60, TimeUnit.MINUTES)
                        .recordStats()
                        .build());
    }
}

然后在codeBase中我使用:

“自定义缓存”

Cache cache = cacheManager.getCache("customCache")
String result = cache.get("myKey", () -> "cachedValue")

根据我的实验,它会将缓存中的值保持 60 秒,预计 60 分钟。

如何达到预期的效果?

【问题讨论】:

  • 对不起,我对 Spring 不熟悉。我相信您可以在这种情况下使用registerCustomCache
  • @Ben Manes hm...spring 5.1.19 没有这种方法
  • 自 5.2.8 起可用

标签: java spring caching caffeine-cache


【解决方案1】:

我认为更好的方法如下。

@Configuration
@EnableCaching
public class CaffeineCacheConfig
{
    @Bean
    public CacheManager cacheManager(
            @Qualifier("oneMinuteCache") final Cache<Object, Object> oneMinuteCache,
            @Qualifier("oneHourCache") final Cache<Object, Object> oneHourCache)
    {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        cacheManager.setCaches(Arrays.asList(
                new CaffeineCache("oneMinuteCache", oneMinuteCache),
                new CaffeineCache("oneHourCache", oneHourCache)));
        return cacheManager;
    }

    @Bean
    public Cache<Object, Object> oneMinuteCache()
    {
        return Caffeine.newBuilder()
                .maximumSize(10000)
                .expireAfterWrite(1, TimeUnit.MINUTES)
                .recordStats()
                .build();
    }

    @Bean
    public Cache<Object, Object> oneHourCache()
    {
        return Caffeine.newBuilder()
                .maximumSize(10000)
                .expireAfterWrite(1, TimeUnit.HOURS)
                .recordStats()
                .build();
    }
}

【讨论】:

  • SimpleCacheManager 会与 CaffeineCache 一起使用吗?
  • 我的回答确实将这两者结合使用。除非你的意思是别的,是的。我的代码是一个工作示例。
  • @Bean over oneMinuteCache() 和 oneHourCache() 看起来多余,您可以直接调用该方法
猜你喜欢
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
相关资源
最近更新 更多