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

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

键空间事件通知

Redis里面有一些事件,比如键到期、键被删除等,可以通过打开redis键空间事件通知来让 Redis 一旦触发这些事件的时候就往特定的Channel推一条消息


这样的机制经常可以利用在比如优惠券过期、到期提醒等业务中

比如优惠券的过期可以将优惠券的id存入redis,并设置过期时间,等待过期后,将会被redis触发过期键空间事件,并主动发布至指定频道

只需要维护订阅端为阻塞守护进程,订阅这个频道就可以及时捕获到优惠券过期的这个时间

键事件通知配置

默认在redis中,键事件通知是不打开的,需要我们手动配置,具体的选项如下,默认他是个空字符串,代表关闭状态

notify-keyspace-events ""
  • 关于这条属性的选项,在配置文件也有了详细的介绍,如下
选项字符解释
K键空间通知,所有通知以__keyspace@__ 为前缀
E键事件通知,所有通知以__keyevent@__ 为前缀
gDELEXPIRERENAME等类型无关的通用命令的通知
$字符串命令的通知
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

过期键事件.gif

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李恩泽的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值