Redis事件通知(keyspace notification)

本文详细介绍了Redis的键空间通知功能,包括其工作原理、事件类型、配置方法及注意事项。键空间通知允许客户端通过订阅频道接收数据集变动事件,利用Redis的订阅与发布功能实现。文章还探讨了开启通知功能的资源消耗问题,并提供了过期事件的测试示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Keyspace 通知使得客户端可以通过订阅频道或模式,来接收那些以某种方式改动了 Redis 数据集的事件(触发某些事件后可以向指定的频道发送通知),该功能需要 Redis 版本大于 2.8。

事件通过 Redis 的订阅与发布功能(pub/sub)来进行分发,因此所有支持订阅与发布功能的客户端都可以在无须做任何修改的情况下,直接使用此功能。

因为 Redis 目前的订阅与发布功能采取的是发送即忘(fire and forget)策略,所以如果你的程序需要可靠事件通知(reliable notification of events),那么目前的键空间通知可能并不适合你:当订阅事件的客户端断线时,它会丢失所有在断线期间分发给它的事件。

事件的类型#

对于每个修改数据库的操作,键空间通知都会发送两种不同类型的事件:键空间通知(key-space)和键事件通知(key-event)。

当 del mykey 命令执行时:

  • 键空间频道的订阅者将接收到被执行的事件的名字,在这个例子中,就是 del
  • 键事件频道的订阅者将接收到被执行事件的键的名字,在这个例子中,就是 mykey

配置#

因为开启键空间通知功能需要消耗一些 CPU,所以在默认配置下,该功能处于关闭状态。

修改 redis.conf 中的  notify-keyspace-events  参数,参数可以是以下字符的任意组合, 它指定了服务器该发送哪些类型的通知:

输入的参数中至少要有一个 K 或者 E,否则的话,不管其余的参数是什么,都不会有任何通知被分发。

如: notify-keyspace-events "Ex"  表示对过期事件进行通知发送; notify-keyspace-events "kx" 表示想监控某个 key 的失效事件。将参数设为字符串 AKE 表示发送所有类型的通知。

过期事件测试#

客户端订阅  subscribe __keyevent@0__:expired 

在另一个客户端执行  setex name 10 txl ,10 秒过后,订阅端就会接收到消息:

参考#

http://redisdoc.com/topic/notification.html

https://redis.io/topics/notifications

### 使用 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]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值