今天,我被要求为应用程序正在使用的某些键设置缓存的过期时间,因此我Swift开始寻找Spring @Cacheable表示法提供的所有选项,以设置过期时间或生存时间。 由于Spring没有提供任何可配置的选项来实现它,因此,我利用固定延迟的@Scheduled注释构建了一个实现,如下所示:

@CacheEvict(allEntries = true, cacheNames = { "EMPLOYEE_", "MANAGER_" })
@Scheduled(fixedDelay = 30000)
public void cacheEvict() {
}

现在的问题是我希望从环境值而不是硬编码值填充缓存名称以及固定的延迟时间。 为了实现相同的目的,我在类级别声明了变量(从属性文件填充),并在注释中填充了键的值,这使IDE抱怨值必须是常量,如下所示:

“注释属性CacheEvict.cacheNames的值必须是一个常量表达式”

然后,我开始寻找其他选项来从环境中获取键的值,并遇到了@Scheduled表示法的fixedDelayString元素,它帮助我实现了目标,如下所示:

@Scheduled(fixedDelayString = "${couchbase.cache.flush.fixed.delay}")
public void cacheEvict() {
}

在寻找@CacheEvict注释的类似元素时,不幸的是,在阅读关于SPR-10778的bug的注释后给了我一个提示,该元素不可用,提示说:

“缓存抽象现在支持CacheResolver抽象,并且可以按类和/或在特定操作上全局指定。 CacheResolver使您能够计算要在代码中使用的缓存,从而拥有所需的所有灵活性。”

正如错误所言,要利用CacheResolver动态填充缓存名称,我使用了AbstractCacheResolver的实现从环境中获取缓存的名称,如下所示:

@Value("#{'${couchbase.cache.flush}'}")
private String couchbaseCacheFlush;@Bean(name = "customCacheResolver")public CacheResolver cacheResolver() {CacheResolver cacheResolver = new AbstractCacheResolver(cacheManager()) {@Overrideprotected Collection<String> getCacheNames(CacheOperationInvocationContext<?> context) {return Arrays.asList(couchbaseCacheFlush.split(","));}};return cacheResolver;}

修改cacheEvict()以使用自定义缓存解析器而不是缓存名称完成了当天的任务,如下所示:

@CacheEvict(allEntries = true, cacheResolver = "customCacheResolver")
@Scheduled(fixedDelayString = "${couchbase.cache.flush.fixed.delay}")
public void cacheEvict() {
}

完整的源代码可以在github上找到 。

翻译自: https://www.javacodegeeks.com/2017/01/setting-ttl-cacheable-spring.html

为@Cacheable设置TTL – Spring相关推荐

  1. java socket 设置 ttl_嵌入式 socket编程设置TTL

    #include #include int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen); in ...

  2. 如何设置Java Spring Boot JWT授权和认证

    In the past month, I had a chance to implement JWT auth for a side project. I have previously worked ...

  3. afterclass_通过beforeClass和afterClass设置增强Spring Test Framework

    afterclass 如何允许实例方法作为JUnit BeforeClass行为运行 JUnit允许您在所有测试方法调用之前和之后一次在类级别上设置方法. 但是,通过有意设计,它们将其限制为仅使用@B ...

  4. 具有代理设置的Spring Cloud AWS

    在我的上一篇文章Spring和Amazon Web Services中 ,我简要介绍了Spring Cloud AWS模块以及开发人员现在对它的期望. 从官方文档中看不出来的一件事是,当您的Inter ...

  5. 通过beforeClass和afterClass设置增强Spring Test Framework

    如何允许实例方法作为JUnit BeforeClass行为运行 JUnit允许您在所有测试方法调用之前和之后一次在类级别上设置方法. 但是,通过有意设计,他们将其限制为仅使用@BeforeClass和 ...

  6. php+redis+设置前缀,spring使用Redis自定义前缀后缀名(去掉SimpleKey []+自定义)

    标签: spring中自动加上 SimpleKey [] 解决方案 一.自定义后缀名 1.定义类实现KeyGenerator接口 MyKeyGenerator package com.wbg.spri ...

  7. java 设置 cors,Spring MVC配置CORS

    Spring Framework 从4.2开始支持配置CORS. Spring MVC支持CORS的范围包括:方法级别配置CORS 全局配置CORS 方法级别配置CORS 使用注解@CrossOrgi ...

  8. @Cacheable 设置缓存过期时间

    RedisCacheConfig 文件 @Configuration public class RedisCacheConfig {/*** 自定义的缓存key的生成策略 若想使用这个key* 只需要 ...

  9. @cacheable 设置过期时间_缓存面试三连击——聊聊Redis过期策略?内存淘汰机制?再手写一个LRU 吧!...

    大家好,今天我和大家想聊一聊有关redis的过期策略的话题. 听到这里你也许会觉得:"我去,我只是个日常搬砖的,这种偏底层的知识点,我需要care吗?" 话虽如此·,但是兄die, ...

最新文章

  1. SQL Server 2014聚集列存储索引
  2. 新浪云python示例_在新浪云上部署Django应用程序
  3. python真的这么厉害吗-Python为什么这么厉害?——Python ,能用来做什么
  4. php执行系统外部命令的四种方法
  5. the job was canceled什么意思_什么第三人称单数形式?怎么用?
  6. 关系型数据库的核心单元是_核中的数据关系
  7. python正则匹配字符串中的数字_Python正则表达式匹配字符串中的数字
  8. 聚类算法:K-Means
  9. python创建学生类和教师类_python基础知识 ——类
  10. 费波纳奇数c语言,费波纳切数列用C语言怎么编程
  11. 【转】Windows Phone在隔离存储里存取图片文件
  12. RocketMQ(三)RocketMQ入门样例
  13. C# ManualResetEvent 类的理解
  14. 用cmd命令行下载github中的工程文件
  15. mapbox tippecanoe切矢量瓦片参数设置和注意事项
  16. Android 中高级面试题:Activity是如何实现LifecycleOwner的?
  17. SecureCRT和SecureFX用法
  18. ES 如何实现向量搜索【以图搜图/语义搜索】
  19. 最长情的告白就是陪伴【Python七夕祝福】——那些浪漫的开始
  20. HP unix 介绍

热门文章

  1. art-template入门(七)之压缩页面
  2. jvm系列(九):如何优化Java GC
  3. FileDescriptor的作用
  4. JS操作地址栏Location
  5. 分治算法---汉诺塔
  6. Opencv FFmpeg Ubuntu下编译问题
  7. java语言中的访问权限控制符有哪些,18.Java的访问控制符
  8. 转:微服务设计、拆分原则
  9. Hibernate关联关系配置(一对多、一对一和多对多)
  10. 古巴比伦乘法_古巴:为生产做准备