Redis键空间事件通知,过期键空间事件通知
前言
这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题
键空间事件通知
在Redis里面有一些事件,比如键到期、键被删除等,可以通过打开redis键空间事件通知来让 Redis 一旦触发这些事件的时候就往特定的Channel推一条消息
这样的机制经常可以利用在比如优惠券过期、到期提醒等业务中
比如优惠券的过期可以将优惠券的id存入redis,并设置过期时间,等待过期后,将会被redis触发过期键空间事件,并主动发布至指定频道,
只需要维护订阅端为阻塞守护进程,订阅这个频道就可以及时捕获到优惠券过期的这个时间
键事件通知配置
默认在redis中,键事件通知是不打开的,需要我们手动配置,具体的选项如下,默认他是个空字符串,代表关闭状态
notify-keyspace-events ""
-
关于这条属性的选项,在配置文件也有了详细的介绍,如下
键空间和键事件
对于每个修改数据库的操作,键空间通知都会发送两种不同类型的事件
比如说,对0号数据库的键mykey执行DEL命令时, 系统将分发两条消息, 相当于执行以下两个PUBLISH命令
PUBLISH __keyspace@0__:mykey del PUBLISH __keyevent@0__:del mykey
-
__keyspace@0__:mykey:接收0号数据库中所有修改键mykey的事件 __keyevent@0__:del:接收0号数据库中所有执行del命令的键
keyspace为前缀的频道被称为键空间通知key-space notification
keyevent为前缀的频道则被称为键事件通知key-event notification
订阅键空间频道,监控被执行事件的键,如监控mykey;那么此时将接收到该键所对应的事件:del
订阅键事件频道,监控某个事件,如del;那么del事件触发时,订阅者收到:mykey
过期的键事件通知
过期的键事件通知常用在订单过期通知等场景下,此时只需要订阅对应过期事件的频道,当某键触发过期事件时,即可接受到对应过期键的消息
redis配置如下
notify-keyspace-events "Ex"
过期键事件 DEMO
设置某个键一定时间后过期
set age 16 expire age 20 # key:age value:16 # 20秒后过期
setex age 20 16
Python DEMO
Python代码的简单示范,订阅过期频道
其实非常简单,和普通的订阅频道一个道理,只不过此时的频道是具有特殊性质的过期事件频道
import redis import time redis = redis.Redis(host=127.0.0.1, port=6379) pubsub = redis.pubsub() pubsub.psubscribe(__keyevent@0__:expired) # 订阅过期事件频道 print(Starting message loop) while True: try: message = pubsub.get_message() if message: print(message) else: time.sleep(0.01) except KeyboardInterrupt: # CTRL + C break