小言_互联网的博客

SpringBoot-观察者模式+监听Redis中Key过期事件

402人阅读  评论(0)

SpringBoot-观察者模式+监听Redis中Key过期事件

在日常开发中,可能会遇到如下业务场景,如:时间太长未付款订单结束通知,用户离线通知,某用户掉线通知等,这些场景可以通过监听Redis中Key过期事件来实现,今天结合设计模式优雅的实现该功能,让我们别的代码更加的优雅

前言

阅读本篇文章若掌握如下知识点会让你看的更加轻松(若还没掌握的可以点击标题阅读)

类设计

首先结合观察者模式,对监听Redis中Key过期事件进行设计,请大家查看如下类图,各角色说明
KeyExpiredSubject:需要发布消息的对象都需要实现该接口,该接口主要是用于注册、删除观察者,以及发送消息给观察者
KeyExpiredObserver:需要接受消息的对象都需要实现该接口,该接口主要是接受消息
KeyExpirationEventMessageListener:这个是springboot-redis依赖提供的一个父类,集成该类重写onMessage就可以收到redis的订阅消息了,该类也有其它方法重写,本片文章主要用onMessage
KeyExpiredListener:一个发布消息的实现,该类初始化时会把所有观察者注册将来,由该类一个容器维护着,当接受到Redis发送的消息时该类就会遍历观察者容器,并且将接受到的消息发送给观察者
OrderCancel:一个观察者的实现,该类主要接收消息并且做出相应的处理

开启Redis事件监听

Redisnotify-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几个即将过期的值,查看控制台


转载:https://blog.csdn.net/weixin_44642403/article/details/116278262
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场