java - spring中如何每30分钟更新一次缓存?

标签 java spring spring-boot caching spring-cache

我有以下声明:

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

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

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

spring中有什么可以方便实现的吗?

最佳答案

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

关于java - spring中如何每30分钟更新一次缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57886754/

相关文章:

SPRING WS 未命中 "<?xml version="1. 0"encoding="UTF- 8"?>"

java - 在浏览器中直接点击 post 方法 url 时显示错误消息

java - 我可以针对比编译器更旧的 Java 环境吗?

java - 如何创建文件并写入文件?

java - 遍历所有 JDK 类

model-view-controller - Controller (Spring Managed Bean)范围问题 : Singleton, 请求还是 session ?

spring - 多事务管理器注解配置

java - eclipse 中的 Args 语句

java - 如何使用 Spring "matches"方法检查旧密码?

arrays - 尝试在 kotlin 中使用 jooq any 运算符时出现编译错误