SpringBoot-观察者模式+监听Redis中Key过期事件
在日常开发中,可能会遇到如下业务场景,如:时间太长未付款订单结束通知,用户离线通知,某用户掉线通知等,这些场景可以通过监听Redis中Key过期事件来实现,今天结合设计模式优雅的实现该功能,让我们别的代码更加的优雅
前言
阅读本篇文章若掌握如下知识点会让你看的更加轻松(若还没掌握的可以点击标题阅读)
类设计
首先结合观察者模式,对监听Redis中Key过期事件进行设计,请大家查看如下类图,各角色说明
KeyExpiredSubject:需要发布消息的对象都需要实现该接口,该接口主要是用于注册、删除观察者,以及发送消息给观察者
KeyExpiredObserver:需要接受消息的对象都需要实现该接口,该接口主要是接受消息
KeyExpirationEventMessageListener:这个是springboot-redis依赖提供的一个父类,集成该类重写onMessage就可以收到redis的订阅消息了,该类也有其它方法重写,本片文章主要用onMessage
KeyExpiredListener:一个发布消息的实现,该类初始化时会把所有观察者注册将来,由该类一个容器维护着,当接受到Redis发送的消息时该类就会遍历观察者容器,并且将接受到的消息发送给观察者
OrderCancel:一个观察者的实现,该类主要接收消息并且做出相应的处理
开启Redis事件监听
Redis
notify-keyspace-events
参数可以监听很多的参数,居然参数可以看如下表格
字符 | 发送通知 |
---|---|
K | 键空间通知,所有通知以 keyspace@ 为前缀,针对Key |
E | 键事件通知,所有通知以 keyevent@ 为前缀,针对event |
g | DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知 |
$ | 字符串命令的通知 |
l | 列表命令的通知 |
s | 集合命令的通知 |
h | 哈希命令的通知 |
z | 有序集合命令的通知 |
x | 过期事件:每当有过期键被删除时发送 |
e | 驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送 |
A | 参数 g$lshzxe 的别名,相当于是All |
这里我们只需要使用到
notify-keyspace-events Ex
即可,配置完成后重新启动Redis
KeyExpiredSubject
KeyExpiredObserver
KeyExpiredListener
OrderCancelObserver
RedisKeyExpiredConfig
将来编写好的类都注入到Spring中(如果观察者业务无需从Bean工厂获取Service进行数据库操作可以跳过这一步骤)
测试
启动SpringBoot项目,往Redis中Set几个即将过期的值,查看控制台