Redis键空间事件通知,过期键空间事件通知

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些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
经验分享 程序员 微信小程序 职场和发展