之前尝试了一下springboot集成springcahce:https://www.cnblogs.com/a565810497/p/10931426.html

又尝试了用guava设置springcahce的有效时长:https://www.cnblogs.com/a565810497/p/10932149.html

但是终究觉得不太灵活,因为guava设置有效时长只是设置默认的,不能设置多个,而且springcahce不是缓存在数据库上的,那么redis就很适合和springcahce集合起来

首先我们要使用springcahce集成redis先,参考文章:https://blog.battcn.com/2018/05/13/springboot/v2-cache-redis/

添加依赖

在porm.xml添加redis的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

属性配置

## Redis服务器地址
spring.redis.host=127.0.0.1
## Redis服务器连接端口
spring.redis.port=6379
## Redis服务器连接密码(默认为空)
spring.redis.password=
# 一般来说是不用配置的,Spring Cache 会根据依赖的包自行装配
spring.cache.type=redis
# 连接超时时间(毫秒)
spring.redis.timeout=10000
# Redis默认情况下有16个分片,这里配置具体使用的分片
spring.redis.database=0
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0

然后我们就可以基于redis设置springcache的有效时间了,参考文章:https://blog.csdn.net/weixin_42047790/article/details/84189275

在启动类配置有效时长:

@Beanpublic CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {return new RedisCacheManager(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory),this.getRedisCacheConfigurationWithTtl(30*60), // 默认策略,未配置的 key 会使用这个this.getRedisCacheConfigurationMap() // 指定 key 策略
        );}private Map<String, RedisCacheConfiguration> getRedisCacheConfigurationMap() {Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>();//DayCache和SecondsCache进行过期时间配置redisCacheConfigurationMap.put("DayCache", this.getRedisCacheConfigurationWithTtl(24*60*60));redisCacheConfigurationMap.put("SecondsCache", this.getRedisCacheConfigurationWithTtl(2));return redisCacheConfigurationMap;}private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer seconds) {Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)).entryTtl(Duration.ofSeconds(seconds));return redisCacheConfiguration;}@Beanpublic KeyGenerator wiselyKeyGenerator() {return new KeyGenerator() {@Overridepublic Object generate(Object target, Method method, Object... params) {StringBuilder sb = new StringBuilder();sb.append(target.getClass().getName());sb.append("." + method.getName());if(params==null||params.length==0||params[0]==null){return null;}String join = String.join("&", Arrays.stream(params).map(Object::toString).collect(Collectors.toList()));String format = String.format("%s{%s}", sb.toString(), join);//log.info("缓存key:" + format);return format;}};}

分别使用不同时长的cache:

@Override@Cacheable(value = "SecondsCache")public TestTime getTestTime(){return new TestTime(new Date());}@Override@Cacheable(value = "DayCache")public TestTime getTestTime1(){return new TestTime(new Date());}

Secondscache是设置了2秒的生命周期。

DayCache是设置了一天的生命周期。

为什么要那么繁琐的设置呢,其实redis已经可以在添加缓存的时候设置有效时间,但是我们是想用注解的方式 @cacheable 做到不需要代码侵入来实现注解,于是就结合redis和springcahce。

本文源码:https://gitee.com/Hiro-D/Java/tree/master/springcache-redis

转载于:https://www.cnblogs.com/a565810497/p/10937477.html

springcahce集成redis 设置过期时间相关推荐

  1. redis设置过期时间与直接detele key有什么区别

    redis设置过期时间与直接detele key有什么区别 Redis 中设置过期时间和直接删除 key 有以下几点区别: 效率:当使用 key 的过期时间时,Redis 会在 key 过期时自动删除 ...

  2. java redis设置过期时间_Redis的一些核心原理

    点关注,不迷路:持续更新Java相关技术及资讯!!! 一.Redis的单线程和高性能 Redis 单线程为什么还能这么快? 因为它所有的数据都在内存中,所有的运算都是内存级别的运算(纳秒),而且单线程 ...

  3. java如何保证redis设置过期时间的原子性_2020年4月Redis面试题和答案整理

    点关注,不迷路:持续更新Java相关技术及资讯!!! 关注.转发.评论头条号每天分享java 知识,私信回复"源码" 赠送Spring源码分析.Dubbo.Redis.Netty. ...

  4. redis如何设置定时过期_redis补充6之Redis 设置过期时间

    一般情况下,我们设置保存的缓存数据的时候都会设置一个过期时间. Redis 中有个设置时间过期的功能,即对存储在 Redis 数据库中的值可以设置一个过期时间.作为一个缓存数据库,这是非常实用的.如我 ...

  5. java如何保证redis设置过期时间的原子性_分布式锁用 Redis 还是 Zookeeper

    在讨论这个问题之前,我们先来看一个业务场景: 系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用户下单. 由于系统有 ...

  6. springboot 集成jwt设置过期时间_传说中的jwt,我们来征服一下

    原创:猿逻辑,欢迎分享,转载请保留出处. 本文的完整示例代码,见github仓库.小q只在文中介绍最关键的代码块. https://github.com/yuanluoji/purestart-spr ...

  7. java如何保证redis设置过期时间的原子性_redis专题系列22 -- 如何优雅的基于redis实现分布式锁

    几个概念 线程锁:主要用来给方法.代码块加锁.当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段.线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比 ...

  8. Redis设置过期时间为当月月底-----自动计算

    今天在新的需求里面,有这么一个要求,要求设置redis过期时间为当月月底,意思是如果一号存进redis,则过期时间为月底:如果29号存进redis,则过期时间同样为月底.我想的就是获取当前时间,算出当 ...

  9. redis缓存失效时间设为多少_java操作Redis缓存设置过期时间的方法

    关于Redis的概念和应用本文就不再详解了,说一下怎么在java应用中设置过期时间. 在应用中我们会需要使用redis设置过期时间,比如单点登录中我们需要随机生成一个token作为key,将用户的信息 ...

  10. 如何用java操作Redis缓存设置过期时间

    如何用java操作Redis缓存设置过期时间?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获. 在应用中我们会需要使用red ...

最新文章

  1. 【代码实战】基于pytorch实现中文文本分类任务
  2. Rstudio连接spark失败
  3. poj pku 2528 线段树的基础应用
  4. 大学计算机人工智能知识点,人工智能知识点大集锦
  5. #绘制圆心_SolidWorks2018 绘制草图轮廓练习
  6. 【Linux】一步一步学Linux——Linux系统常用快捷键(12) 待更新...
  7. win8.1远程连接Redis数据库
  8. 15/100. Climbing Stairs
  9. 属于服务器端运行的程序_生信分析云平台产品开发 - 5 生信分析pipeline服务器端运行...
  10. 深度解析PolarDB数据库并行查询技术
  11. 【Docker】容器镜像有哪些特性
  12. 雨滴桌面时间插件_只需要五步,让你的桌面变得干净漂亮
  13. js判断字符串中某个字母出现次数最多
  14. 学python可以做什么职业-python学完之后比较适合哪些职业工作呢?
  15. vim替换字符串命令详解
  16. html取消父元素样式,CSS以防止子元素继承父样式
  17. 【自动控制原理】系统带宽
  18. The bussiness flow between DWM and ECC
  19. photoshop基本的操作
  20. BOL简单分析(二)

热门文章

  1. C++/ python 计算硬币正面朝上的概率
  2. Atitit 程序设计概论 艾提拉著作 目录 1. 界面ui设计 1 2. 编程语言部分 1 3. 面向对象的程序设计 1 4. 算法章节 数据结构 1 5. 第21章 标准库 2 5.1. 文件i
  3. Atitit。  工作流引擎的发展趋势
  4. Paip.声明式编程以及DSL 总结
  5. paip.提升性能--多核编程中的java .net php c++最佳实践 v2.0 cah
  6. paip.jquery ajax 请求JSON数据填充SELECT全过程纪录
  7. 5款手机通讯录同步工具
  8. 搞明白“清算-结算”的二级制
  9. 要么放权,要么输得起 | 卫哲谈战略
  10. 阿里云何登成:开放平台助力企业高效上云管云 | 云栖大会