Redis键空间通知(Keyspace Notification)

Redis 2.8.0引入键空间通知,允许客户端订阅数据变化。配置后,通过PUBLISH/SUBSCRIBE模式监听特定事件,如键过期、删除等。此功能不保证可靠性,客户端断开连接时可能错过事件。可以通过命令如`CONFIG SET notify-keyspace-events`开启,并用`SUBSCRIBE`或`PSUBSCRIBE`订阅。示例包括订阅键过期事件和所有事件。

从Redis 2.8.0开始,Redis加入了发布/订阅模式以及键空间消息提醒(keyspace notification)功能。键空间消息提醒提供了允许客户端通过订阅指定信道获取Redis数据变化的能力。

需要注意的是,键空间消息提醒并非可靠的,它不会对订阅端是否接收到消息进行确认。例如某个订阅的客户端暂时断开连接,在其直到恢复连接期间发生的事件将无法再次获得。

配置

在默认情况下,Redis并未开启键空间消息提醒功能。为了打开该功能,需要通过notify-keyspace-events配置进行设置,例如:

redis> CONFIG GET notify-keyspace-events
1) "notify-keyspace-events"
2) ""
redis> CONFIG SET notify-keyspace-events KEA
OK
redis> CONFIG GET notify-keyspace-events
1) "notify-keyspace-events"
2) "AKE"

在上述示例中将notify-keyspace-events配置为KEA,代表除未命中外的所有事件。其中,KE代表事件的两种类型——KeyspaceKeyeventKeyspace代表与事件名称相关的消息,例如订阅对指定键进行的操作事件;Keyevent代表与键名称相关的消息,例如订阅发生键过期事件的相关键名称。

关于更多的notify-keyspace-events配置,可参考下面的描述:

  • K:Keyspace事件,将会以__keyspace@<db>__作为事件的前缀
  • E:Keyevent事件,将会以__keyevent@<db>__作为事件的前缀
  • g:非特定类型的通用命令,例如DELEXPIRERENAME
  • $:字符串命令,例如SETINCR
  • l:列表命令,例如LPUSHLPOP
  • s:集合命令,例如SADDSREM
  • h:哈希表命令,例如HSETHINCRBY
  • z:有序集合命令,例如ZSETZREM
  • t:流命令,例如XADDXDEL
  • x:过期事件(在每个发生键过期的时侯产生)
  • e:淘汰事件(在每个发生键被淘汰的时候产生)
  • m:未命中事件(在访问某个不存在的键使产生)
  • A:配置g$lshztxe的别名,但不包括未命中事件m

订阅指定事件

在完成配置后,可通过SUBSCRIBE命令订阅指定信道实现对一个或多个指定事件的订阅。例如通过订阅__keyevent@0__:expired实现订阅数据库0中的键过期事件例如示例1:订阅键过期事件

订阅的信道的格式为__<type>@<db>__:<event>,其包括了事件类型(keyspacekeyevent)、数据库(例如数据库0)以及事件(例如expired)三部分组成。对应事件的名称,可参考下文命令事件章节。

另外,也可以通过PSUBSCRIBE命令订阅一个或多个复合正则表达式匹配的信道。例如通过订阅__key*@*__:*订阅Redis中所有数据库中的所有事件。

命令事件

Redis为许多命令提供了不同的事件,在本文中将选择其中部分命令及其对应的事件进行介绍:

  • DEL:在某个键被删除时产生del事件
  • EXPIREPEXPIREEXPIREAT以及PEXPIREAT:当设置正数过期时间或未来时间的时间戳,则产生expire事件,否则产生del事件(将立即被删除)
  • SET以及同类的SETEXSETNXGETSET:产生set事件,若使用SETEX则也会产生expire事件
  • MSET:将会为每个键都产生一个set事件
  • LPUSHLPUSHXRPUSHRPUSHX:根据插入的方向分别产生lpushrpush事件
  • RPOPLPOP:分别产生rpoplpop事件,若移出的是列表中的最后一个元素,将会同时产生del事件
  • LSET:产生lset事件
  • LREM:产生lrem事件,同样若移除的元素为列表中的最后一个元素时将同时产生del事件
  • HSETHSETNX以及HMSET:产生一个hset事件
  • HDEL:产生一个hdel事件,且在移除后哈希表为空的情况下产生del事件
  • SADD:产生一个sadd事件
  • SREM:产生一个srem事件,且在移除后集合为空的情况下产生del事件
  • SMOVE:原键中产生srem事件且在目标键中产生sadd事件
  • SINTERSTORESUNIONSTORESDIFFSTORE:分别产生sinterstoresunionstore以及sdiffstore事件,且在结果为空集且目标键存在的情况下,将会产生del事件
  • ZADD:无论添加几个元素都只产生一个zadd事件
  • ZREM:无论移除几个元素都只产生一个zrem事件,当移除后有序集合为空时产生del事件
  • XADD:产生xadd事件,若使用MAXLEN子命令可能会同时产生xtrim事件
  • XDEL:产生xdel事件
  • PERSIST:如果对应的键所关联的过期事件成功被移除,则产生persist事件
  • 在键发生过期时产生expired事件
  • 在达到maxmemory设定的内存值后发生键淘汰时产生evicted事件
  • ……

关于更多的命令相关事件,请参考keyspace notification相关文档

示例

订阅键过期事件

redis1> SUBSCRIBE __keyevent@0__:expired
1) "subscribe"
2) "__keyevent@0__:expired"
3) (integer) 1
# redis2> SETEX greeting 1 "hello world"
# 等待1秒后:
1) "message"
2) "__keyevent@0__:expired"
3) "greeting"

订阅所有事件

redis1> PSUBSCRIBE __key*@*__:*
1) "psubscribe"
2) "__key*@*__:*"
3) (integer) 1
# redis2> SET greeting "hello world"
1) "pmessage"
2) "__key*@*__:*"
3) "__keyspace@0__:greeting"
4) "set"
1) "pmessage"
2) "__key*@*__:*"
3) "__keyevent@0__:set"
4) "greeting"

参考资料

### 使用 Redis Keyspace Notifications 的功能 Redis 提供了一种称为 **Keyspace Notifications** 的机制,用于监听数据库中的键变化事件并触发相应的消息通知。默认情况下,此功能是禁用的,因为启用它会消耗一定的 CPU 资源[^1]。 #### 启用 Keyspace Notifications 要启用 Keyspace Notifications 功能,可以通过以下两种方式之一完成: 1. 修改 `redis.conf` 文件: 打开 Redis 配置文件 `/etc/redis/redis.conf` 并找到 `notify-keyspace-events` 参数。将其设置为所需的事件类型组合字符串。例如,如果希望接收所有的键空间和键事件,则可以这样配置: ```conf notify-keyspace-eventsAKE ``` 这里的字母表示不同的事件类别,具体含义如下: - A: 表示所有事件。 - K: 键空间 (keyspace) 事件。 - E: 键事件 (keyevent) 事件。 完成修改后重启 Redis 实例以使更改生效[^4]。 2. 使用 CONFIG 命令动态调整: 如果不想编辑配置文件或者需要临时开启该特性,可以直接运行命令来实现: ```bash CONFIG SET notify-keyspace-events "AKE" ``` #### 订阅 Keyspace Events 一旦启用了 Keyspace Notifications,就可以通过订阅频道或模式匹配的方式来捕获这些事件。以下是具体的例子: - **订阅特定类型的 keyevents** 下面的例子展示了如何订阅删除操作产生的 `del` 类型的通知: ```bash PSUBSCRIBE __keyevent@0__:del ``` 当某个键被删除时,客户端将会收到类似下面的消息: ``` pmessage __keyevent@0__:del __keyevent@0__:myKey myKey ``` - **获取所有 keyspace events** 若要跟踪任何键的变化情况而不仅仅是某些特定的操作结果,可采用通配符形式进行广泛监测: ```bash SUBSCRIBE '__key*' ``` #### 示例代码展示 这里给出一段 Python 程序作为实例演示如何利用 Pub/Sub API 来处理来自 Rediskeyspace notification 数据流: ```python import redis def listen_to_redis_events(): r = redis.StrictRedis(host='localhost', port=6379, db=0) pubsub = r.pubsub() # Subscribe to all key space notifications on DB index 0. pattern = '__keyspace@0__:*' pubsub.psubscribe(pattern) print(f'Subscribed to {pattern}') try: for message in pubsub.listen(): if message['type'] == 'pmessage': _, channel_name, event_key = message['channel'].decode().split(':') action = message['data'].decode() print(f'{action} happened at key={event_key}') except KeyboardInterrupt: print('Stopping listener...') if __name__ == "__main__": listen_to_redis_events() ``` 上述脚本启动了一个持续监听器,每当指定数据库内的任意键发生变化都会打印对应的动作描述以及涉及的具体键名[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值