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以两种方式过期:
  1. 当命令访问键并发现其已过期时,此时Redis还没有删除键,但过期不可访问。
  1. Redis后台进程查找到过期键。
Redis会在以上两种情况生成过期事件,如果没有不断的轮询带TTL的键,并且有许多带有TTL的键,那么键的TTL到达0值时与生成过期事件之间可能存在明显延迟。
一句话总结就是,过期事件是在Redis服务器删除键时生成的,而不是在TTL到达0值时生成的。
Redis的这个功能符合我的需求,以来Redis的键不多,二来即使有延迟只要保证最终一致性就可以了。

实战

notion image

© Ryan Tang 2021 - 2025