前言
这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题
于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。
微信小程序搜索:Python面试宝典
或可关注原创个人博客:https://lienze.tech
也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习
键空间事件通知
在Redis
里面有一些事件,比如键到期、键被删除等,可以通过打开redis
键空间事件通知来让 Redis
一旦触发这些事件的时候就往特定的Channel
推一条消息
这样的机制经常可以利用在比如优惠券过期、到期提醒等业务中
比如优惠券的过期可以将优惠券的id
存入redis
,并设置过期时间,等待过期后,将会被redis
触发过期键空间事件,并主动发布至指定频道,
只需要维护订阅端为阻塞守护进程,订阅这个频道就可以及时捕获到优惠券过期的这个时间
键事件通知配置
默认在redis
中,键事件通知是不打开的,需要我们手动配置,具体的选项如下,默认他是个空字符串,代表关闭状态
notify-keyspace-events ""
- 关于这条属性的选项,在配置文件也有了详细的介绍,如下
选项字符 | 解释 |
---|---|
K | 键空间通知,所有通知以__keyspace@__ 为前缀 |
E | 键事件通知,所有通知以__keyevent@__ 为前缀 |
g | DEL 、EXPIRE 、RENAME 等类型无关的通用命令的通知 |
$ | 字符串命令的通知 |
l | 列表命令的通知 |
s | 集合命令的通知 |
h | 哈希命令的通知 |
z | 有序集合命令的通知 |
x | 过期事件:每当有过期键被删除时发送 |
e | 驱逐(evict) 事件:每当有键因为maxmemory 政策而被删除时发送 |
A | 参数g$lshzxe 的别名 |
键空间和键事件
对于每个修改数据库的操作,键空间通知都会发送两种不同类型的事件
比如说,对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