Redis 系列(二十六):Redis 键空间通知特性
Redis 从 2.8.0 版本开始提供了 键空间通知 特性。键空间通知允许客户端订阅发布/订阅通道,以便接收以某种方式影响Redis 数据集的事件。
Redis Keyspace Notifications:https://redis.io/topics/notifications
特性概览
Redis 从 2.8.0 版本开始提供了 键空间通知 特性。键空间通知允许客户端订阅发布/订阅通道,以便接收以某种方式影响Redis 数据集的事件。
可以接收的事件的示例有:
- 所有影响指定 KEY 的命令。
- 所有 KEY 都接受 LPUSH 操作。
- 所有 KEY 都在 db0 库中过期。
事件是使用 Redis 常规的 Pub/Sub 层传递的,因此实现 Pub/Sub 的客户端都可以使用此功能,无需额外修改。
因为 Redis 的 Pub/Sub 是 即发即忘 的,所以如果应用程序要求可靠的事件通知,该功能就无法满足就不能使用了。也就是说,如果 Pub/Sub 客户端断开连接,然后重新连接,那么客户端断开连接期间传递的所有事件都将丢失。
将来有计划允许更可靠地传递事件,但可能这将在更一般的级别上解决,要么给 Pub/Sub 本身带来可靠性,要么允许 Lua
脚本拦截 Pub/Sub 消息以执行诸如将事件推送放入列表之类的操作。
Redis命令实现
Redis 开启键空间通知功能,两种方式:
- redis-client 登录后,通过命令设置开启:
config set notify-keyspace-events Ex
,服务重启后失效。 - 编辑配置文件
redis.conf
,设置notify-keyspace-events "Ex"
,重启 Redis 服务。
- redis-client 登录后,通过命令设置开启:
开启一个客户端订阅键空间通知事件。注意:
_keyevent@0
前后是两个下划线。__keyevent@0__:expired
:表示订阅0
号db
的 键过期事件。1
2
3
4
5
6[root@localhost bin]# ./redis-cli -h 192.168.50.128
192.168.50.128:6379> psubscribe __keyevent@0__:expired
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__keyevent@0__:expired"
3) (integer) 1再开启一个客户端设置健值和过期时间
1
2192.168.50.128:6379> setex name 10 Kitty
OK订阅键空间通知的客户端输出如下信息,表示订阅键空间通知成功
1
2
3
41) "pmessage"
2) "__keyevent@0__:expired"
3) "__keyevent@0__:expired"
4) "name"
实现延时队列
开启键空间事件
客户端登录后,通过命令设置开启:config set notify-keyspace-events Ex
,服务重启后失效。
编辑配置文件 redis.conf
,设置 notify-keyspace-events "Ex"
,重启 Redis 服务。
客户端订阅事件:
注意:keyevent@0 前后是两个下划线。
__keyevent@0__:expired
:表示订阅 0
号 db
的 键过期事件。
1 | [root@localhost bin]# ./redis-cli -h 192.168.50.128 |
另一个客户端设置键值和过期时间:
1 | 192.168.50.128:6379> setex name 10 Kitty |
订阅端输出如下信息:
1 | 1) "pmessage" |
事件类型
配置
不同命令生成的事件
过期事件计时
事件集群
Redis 系列(二十六):Redis 键空间通知特性
http://blog.gxitsky.com/2021/03/11/Redis-26-keyspace-notice/