春天如何每30分钟更新一次缓存?

时间:2019-09-11 10:04:42

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

我有以下声明:

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

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

此外,我想在这种情况下,所有书籍都将被清除,但更可取的是仅更新陈旧的数据(已在30分钟前放入缓存中)

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

1 个答案:

答案 0 :(得分:0)

缓存实现为该任务提供了名为写入后过期生存时间的功能。不同的缓存实现有很多差异。在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的缓存也可能拒绝操作,并要求您仅使用一种配置方式。