很多业务场景,例如订单过期自动删除,订单几天后自动好评,这些常用操作可以通过定时任务,数据库轮询做,但是订单量大的情况可能会对数据库产生大的压力。

所以今天介绍的就是 redis 缓存过期通知。

注: 楼主技术提升的同时, 这个博文失效吧, 这个只能适用于单机redis, 订单过期删除这些操作还是通过rocketMq, 或者时间轮, 或者Zset进行操作吧


1. 事件通过 Redis 的订阅与发布功能(pub/sub)来进行分发, 故需要开启 redis 的事件监听与发布

2. 修改 redis.conf 文件

打开 notify-keyspace-events Ex 的注释,开启过期通知功能

 
  1. # 我这边开启事件监听

  2. notify-keyspace-events Ex

3. 重启redis , 即可测试失效事件的触发, 监听获取的值为 key


进入redis-client,进入监听

 
  1. 127.0.0.1:6379> PSUBSCRIBE __keyevent@*__:expired

  2. Reading messages... (press Ctrl-C to quit)

  3. 1) "psubscribe"

  4. 2) "__keyevent@*__:expired"

  5. 3) (integer) 1

再打开一个 redis-client,发送过期数据

 
  1. 127.0.0.1:6379> setex test 2 2

  2. OK

返回之前的 client,监听到过期事件

 
  1. 127.0.0.1:6379> PSUBSCRIBE __keyevent@*__:expired

  2. Reading messages... (press Ctrl-C to quit)

  3. 1) "psubscribe"

  4. 2) "__keyevent@*__:expired"

  5. 3) (integer) 1

  6. 1) "pmessage"

  7. 2) "__keyevent@*__:expired"

  8. 3) "__keyevent@0__:expired"

  9. 4) "test"

至此,redis 环境配置完毕;


接下来是服务端配置监听事件:

/*** Description: Redis超时监听器* User: zhouzhou* Date: 2019-04-07* Time: 9:02 PM*/
@Service
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {private static Logger log = LoggerFactory.getLogger(RedisKeyExpirationListener.class);public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}@Overridepublic void onMessage(Message message, byte[] pattern) {//获取过期的keyString expireKey = message.toString();System.out.println("终于失效了");log.debug("key is:"+ expireKey);System.out.println(expireKey);//这里还可以根据key的自定义前缀来判断执行哪个条件//......}
}
配置 redis 远程监听配置:
/*** Description: redis 远程监听* User: zhouzhou* Date: 2019-04-17* Time: 3:04 PM*/
@Configuration
public class RedisListenerConfig {@BeanRedisMessageListenerContainer listenerContainer(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer listenerContainer = new RedisMessageListenerContainer();listenerContainer.setConnectionFactory(connectionFactory);return listenerContainer;}@BeanKeyExpirationEventMessageListener redisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {return new RedisKeyExpirationListener(listenerContainer);}}

redis 连接的配置我就不发了。

启动项目,当我们再次通过 redis-client 进行测试;可以看到 console打印一下日志:

 
  1. 终于失效了

  2. test

监听Redis 缓存过期(Key 失效)事件相关推荐

  1. JAVA redis缓存过期_失效java服务器

    Java 并发/多线程教程--4并发模型 本系列译自jakob jenkov的Java并发多线程教程(本章节部分内容参考http://ifeve.com/并发编程模型),个人觉得很有收获.由于个人水平 ...

  2. springboot listener_Springboot 监听redis key的过期事件

    项目中常常会碰到这样的需求,用户下订单后,30分钟未完成自动取消订单的功能. 有人说这个简单呀,写个定时任务就搞定了.除了定时任务之外,难道就没有其他的方法来实现吗?有--Redis 的键空间通知事件 ...

  3. Spring Boot 监听 Redis Key 失效事件实现定时任务

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:彭超 https://antoniopeng.com 业务场 ...

  4. redis 能不能监听特定的key失效_php监听redis key失效触发回调事件

    订单超时.活动过期解决方案:php监听redis key失效触发回调事件 Redis 的 2.8.0 版本之后可用,键空间消息(Redis Keyspace Notifications),配合 2.0 ...

  5. redis 能不能监听特定的key失效_Spring boot实现监听Redis key失效事件实现和其它方式...

    1.pom 中添加依赖 org.springframework.boot spring-boot-starter-data-redis 2.定义配置RedisListenerConfig /** * ...

  6. php 监听redis,php监听redis key失效触发回调事件_后端开发

    php中使用fsockopen实现异步请求(代码示例)_后端开发 php执行一段程序,有可能几毫秒就执行完毕,也有可能耗时较长.例如,用户下单这个事件,如果调用了些第三方服务进行发邮件.短信.推送等通 ...

  7. php 监听redis,php监听redis key失效触发回调事件

    订单超时.活动过期解决方案:php监听redis key失效触发回调事件 Redis 的 2.8.0 版本之后可用,键空间消息(Redis Keyspace Notifications),配合 2.0 ...

  8. 监听Redis Key事件

    文章目录 1.使用场景 2.使用 开启 redis 的事件监听与发布 Springboot集成 1.使用场景 处理订单过期自动取消,比如下单30分钟未支付自动更改订单状态. 注意:只能适用于单机red ...

  9. SpringBoot监听redis Key变化事件详解

    键空间通知(keyspace notification) 一 .功能概览 键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis key变化的事件. 所有修改key键的命 ...

最新文章

  1. 面了个 32+ 岁 Java 大佬,一言难尽......
  2. 【java8】中stream的.findAny().orElse (null) 是什么意思?
  3. 将声音转为图片(二维矩阵)
  4. groovy怎样从sql语句中截取表名_sql注入mysql篇
  5. mysql主从数据丢失_故障分析 | 记一次 MySQL 主从双写导致的数据丢失问题
  6. 稀疏自编码器_基于tensorflow实现稀疏自编码和在推荐中的应用
  7. position的高级使用
  8. 阿里云技术白皮书_对阿里重磅发布的云原生架构白皮书的初步解读
  9. Mac插件分享——AE插件、PS插件、FCPX插件【持续更新中】
  10. python用circle画多边形_pythonopencv圆、椭圆与任意多边形的绘制
  11. ubuntu重命名移动硬盘
  12. mysql 分页查询几种语法_各数据库2种分页语法支持
  13. jQuery插件开发之windowScroll
  14. 58 同城 iOS 客户端搜索模块组件化实践
  15. c++输出小数点后几位_Python格式化输出:%s和format()用法比较
  16. 树莓派(RespberryPi)安装手记
  17. c语言转化音乐格式转换器安卓版,音频提取格式转换
  18. 【嵌入式模块】DS18B20 数字温度传感器
  19. python turtle后退_Turbot与python教程-实现后退
  20. 【探花交友】今日佳人

热门文章

  1. 一个文件的开源项目,开启你的开源之旅
  2. 国内 Github 下载加速
  3. R语言Sys.Date函数获取当前日期、将独立的年、月、日、时间、分钟、秒信息转化为对应的时间信息
  4. R语言时间序列中时间年、月、季、日的处理
  5. Unity 针对移动平台后台下载的官方插件BackgroundDownload
  6. 淘宝微信如何进入微信推广?
  7. win10下安装Docker for Windows
  8. 软件测试面试(名企摸底:阿里,腾讯,360)
  9. 仿QQ聊天工具(Android源码)
  10. 计算免息分期的收益 及 年金/复利现值终值的理解