监听Redis 缓存过期(Key 失效)事件
很多业务场景,例如订单过期自动删除,订单几天后自动好评,这些常用操作可以通过定时任务,数据库轮询做,但是订单量大的情况可能会对数据库产生大的压力。
所以今天介绍的就是 redis 缓存过期通知。
注: 楼主技术提升的同时, 这个博文失效吧, 这个只能适用于单机redis, 订单过期删除这些操作还是通过rocketMq, 或者时间轮, 或者Zset进行操作吧
1. 事件通过 Redis 的订阅与发布功能(pub/sub)来进行分发, 故需要开启 redis 的事件监听与发布
2. 修改 redis.conf 文件
打开 notify-keyspace-events Ex 的注释,开启过期通知功能
# 我这边开启事件监听
notify-keyspace-events Ex
3. 重启redis , 即可测试失效事件的触发, 监听获取的值为 key
进入redis-client,进入监听
127.0.0.1:6379> PSUBSCRIBE __keyevent@*__:expired
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__keyevent@*__:expired"
3) (integer) 1
再打开一个 redis-client,发送过期数据
127.0.0.1:6379> setex test 2 2
OK
返回之前的 client,监听到过期事件
127.0.0.1:6379> PSUBSCRIBE __keyevent@*__:expired
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__keyevent@*__:expired"
3) (integer) 1
1) "pmessage"
2) "__keyevent@*__:expired"
3) "__keyevent@0__:expired"
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打印一下日志:
终于失效了
test
监听Redis 缓存过期(Key 失效)事件相关推荐
- JAVA redis缓存过期_失效java服务器
Java 并发/多线程教程--4并发模型 本系列译自jakob jenkov的Java并发多线程教程(本章节部分内容参考http://ifeve.com/并发编程模型),个人觉得很有收获.由于个人水平 ...
- springboot listener_Springboot 监听redis key的过期事件
项目中常常会碰到这样的需求,用户下订单后,30分钟未完成自动取消订单的功能. 有人说这个简单呀,写个定时任务就搞定了.除了定时任务之外,难道就没有其他的方法来实现吗?有--Redis 的键空间通知事件 ...
- Spring Boot 监听 Redis Key 失效事件实现定时任务
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:彭超 https://antoniopeng.com 业务场 ...
- redis 能不能监听特定的key失效_php监听redis key失效触发回调事件
订单超时.活动过期解决方案:php监听redis key失效触发回调事件 Redis 的 2.8.0 版本之后可用,键空间消息(Redis Keyspace Notifications),配合 2.0 ...
- redis 能不能监听特定的key失效_Spring boot实现监听Redis key失效事件实现和其它方式...
1.pom 中添加依赖 org.springframework.boot spring-boot-starter-data-redis 2.定义配置RedisListenerConfig /** * ...
- php 监听redis,php监听redis key失效触发回调事件_后端开发
php中使用fsockopen实现异步请求(代码示例)_后端开发 php执行一段程序,有可能几毫秒就执行完毕,也有可能耗时较长.例如,用户下单这个事件,如果调用了些第三方服务进行发邮件.短信.推送等通 ...
- php 监听redis,php监听redis key失效触发回调事件
订单超时.活动过期解决方案:php监听redis key失效触发回调事件 Redis 的 2.8.0 版本之后可用,键空间消息(Redis Keyspace Notifications),配合 2.0 ...
- 监听Redis Key事件
文章目录 1.使用场景 2.使用 开启 redis 的事件监听与发布 Springboot集成 1.使用场景 处理订单过期自动取消,比如下单30分钟未支付自动更改订单状态. 注意:只能适用于单机red ...
- SpringBoot监听redis Key变化事件详解
键空间通知(keyspace notification) 一 .功能概览 键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis key变化的事件. 所有修改key键的命 ...
最新文章
- 面了个 32+ 岁 Java 大佬,一言难尽......
- 【java8】中stream的.findAny().orElse (null) 是什么意思?
- 将声音转为图片(二维矩阵)
- groovy怎样从sql语句中截取表名_sql注入mysql篇
- mysql主从数据丢失_故障分析 | 记一次 MySQL 主从双写导致的数据丢失问题
- 稀疏自编码器_基于tensorflow实现稀疏自编码和在推荐中的应用
- position的高级使用
- 阿里云技术白皮书_对阿里重磅发布的云原生架构白皮书的初步解读
- Mac插件分享——AE插件、PS插件、FCPX插件【持续更新中】
- python用circle画多边形_pythonopencv圆、椭圆与任意多边形的绘制
- ubuntu重命名移动硬盘
- mysql 分页查询几种语法_各数据库2种分页语法支持
- jQuery插件开发之windowScroll
- 58 同城 iOS 客户端搜索模块组件化实践
- c++输出小数点后几位_Python格式化输出:%s和format()用法比较
- 树莓派(RespberryPi)安装手记
- c语言转化音乐格式转换器安卓版,音频提取格式转换
- 【嵌入式模块】DS18B20 数字温度传感器
- python turtle后退_Turbot与python教程-实现后退
- 【探花交友】今日佳人