【问题标题】:How to update cache every 30 minutes in spring?春季如何每30分钟更新一次缓存?
【发布时间】:2023-03-30 08:11:01
【问题描述】:

我有以下声明:

@Cacheable("books")
public Book findBook(ISBN isbn) {...}

但我想每 30 分钟更新一次缓存。我知道我可以创建@Scheduled 作业来调用注解@CacheEvict("books")的方法

另外,我认为在这种情况下,所有书籍都将被清除,但更希望只更新陈旧数据(这些数据在 30 分钟前被放入缓存)

春天有什么可以促进实施的吗?

【问题讨论】:

  • 查看缓存实现的文档(默认为 EHCache)并调整时间以驱逐超过 30 分钟的项目。
  • @Kayaman here spring.io/guides/gs/caching 提到默认实现使用 ConcurrentHashMap
  • 嗯,这很可能不会是非常可配置的。但这就是你使用真正的缓存的方式。
  • 查看 Caffeine,以前是番石榴缓存,它具有可配置的生存时间 (TTL)。编辑添加:这是一个很好的链接:baeldung.com/java-caching-caffeine 我会避免编码来解决这个问题,应该是一个缓存配置解决方案 imo。

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


【解决方案1】:

缓存实现为此任务提供了一个名为写入后过期生命周期的功能。不同的缓存实现有很多差异。在 Spring 中,也没有尝试抽象或概括配置部分。如果您喜欢使用cache2k,这里是一个在 Spring 中为您的缓存编程配置的示例:

@Configuration
@EnableCaching
public class CachingConfig extends CachingConfigurerSupport  {

  @Bean
  public CacheManager cacheManager() {
    return new SpringCache2kCacheManager()
      .addCaches(
        b->b.name("books").keyType(ISBN.class).valueType(Book.class)
            .expireAfterWrite(30, TimeUnit.MINUTES)
            .entryCapacity(5000);
  }
}

更多信息请参见cache2k User Guide - Spring Framework Support。其他缓存实现,如 EHCache 或 Caffeine 也支持过期,但配置不同。

如果您想以“供应商中立”的方式配置缓存到期,您可以使用支持 JCache/JSR107 标准的缓存实现。该标准包括设置到期日。一种方法,如下所示:

@Configuration
@EnableCaching
public class CacheConfiguration {

  @Bean
  public JCacheCacheManager cacheManager() {
    return new JCacheCacheManager() {
      @Override
      protected Collection<Cache> loadCaches() {
        Collection<Cache> caches = new ArrayList<>();
        caches.add(new JCacheCache(
          getCacheManager().createCache("books",
          new MutableConfiguration<ISBN,Book>()
            .setExpiryPolicyFactory(ModifiedExpiryPolicy.factoryOf(new Duration(TimeUnit.MINUTES, 30)))),
          false));
        return caches;
      }
    };
  }
}

在 JCache 中,有一些您需要的配置选项,它们不是标准的一部分。一个例子是限制缓存大小。为此,您始终需要添加特定于供应商的配置。对于支持JCache的cache2k(我是cache2k的作者),配置合并,在cache2k User Guide - JCache有详细描述。这意味着在编程级别上,您执行配置的“逻辑”部分,而像缓存大小这样的“操作”部分可以在外部配置文件中进行配置。

不幸的是,供应商配置和通过 JCache API 进行的编程配置需要如何互操作并不是标准的一部分。因此,即使是 100% 与 JCache 兼容的缓存也可能会拒绝操作,并要求您仅使用一种配置方式。

【讨论】:

  • 是的,我对支持 JCache 的实现非常感兴趣。如果您也添加一个示例,我将不胜感激
猜你喜欢
  • 1970-01-01
  • 2017-04-11
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2014-12-03
  • 1970-01-01
相关资源
最近更新 更多