Redis的键通知事件
date
Nov 3, 2023
slug
redis-key-space-notification
status
Published
tags
Redis
summary
type
Post
在编码过程中遇到一个需求:想在应用中感知到Redis中某个键过期,然后出发特定逻辑。查了下Redis的文档,Redis确实是有“键事件”(keyspace-event)通知的,只不过默认没开启。
key-space通知种类
Keyspace通知是通过发送两种不同类型的事件来实现的,针对影响Redis数据空间的每个操作。例如,针对数据库0中名为mykey的键执行的DEL操作将触发发送两条消息,完全等同于以下两个PUBLISH命令:
第一个Channel监听所有针对键mykey的事件,而另一个通道只监听键mykey上的
DEL
操作事件。第一种类型的事件,带有键空间前缀的通道称为key-space通知,而带有keyevent前缀的第二种类型称为key-event通知。
在前面的示例中,为键mykey生成了一个
del
事件,导致产生了两条消息:- key-space的channel接收到某个特定的key的操作消息。
- key-event的channel接收到所有键某个操作的所有消息。
可以只启用一种类型的通知,以便只传递我们感兴趣的事件子集。而我感兴趣的是key-event。
如何开启key-space通知
默认情况下,key-space通知是禁用的,该功能会使用一些CPU资源。可以通过
redis.conf
中的notify-keyspace-events参数或通过CONFIG SET
来启用通知。将该参数默认设置为空字符串
notify-keyspace-events ””
即禁用通知。为了启用该功能,需要将该值设置为非空字符串,值由多个字符组成,其中每个字符代表开启不同的功能:而使用值
KAE
就能涵盖大部分的功能。!通过
CONFIG SET
命令设置只是临时的,重启Redis后会失效。关于键过期事件
具有关联生存时间(TTL)的键由Redis以两种方式过期:
- 当命令访问键并发现其已过期时,此时Redis还没有删除键,但过期不可访问。
- Redis后台进程查找到过期键。
Redis会在以上两种情况生成过期事件,如果没有不断的轮询带TTL的键,并且有许多带有TTL的键,那么键的TTL到达0值时与生成过期事件之间可能存在明显延迟。
一句话总结就是,过期事件是在Redis服务器删除键时生成的,而不是在TTL到达0值时生成的。
Redis的这个功能符合我的需求,以来Redis的键不多,二来即使有延迟只要保证最终一致性就可以了。