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命令实现

  1. Redis 开启键空间通知功能,两种方式:

    • redis-client 登录后,通过命令设置开启:config set notify-keyspace-events Ex,服务重启后失效。
    • 编辑配置文件 redis.conf,设置 notify-keyspace-events "Ex",重启 Redis 服务。
  2. 开启一个客户端订阅键空间通知事件。注意:_keyevent@0前后是两个下划线

    __keyevent@0__:expired:表示订阅 0db 的 键过期事件。

    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
  3. 再开启一个客户端设置健值和过期时间

    1
    2
    192.168.50.128:6379> setex name 10 Kitty
    OK
  4. 订阅键空间通知的客户端输出如下信息,表示订阅键空间通知成功

    1
    2
    3
    4
    1) "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:表示订阅 0db 的 键过期事件。

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
2
192.168.50.128:6379> setex name 10 Kitty
OK

订阅端输出如下信息:

1
2
3
4
1) "pmessage"
2) "__keyevent@0__:expired"
3) "__keyevent@0__:expired"
4) "name"

事件类型

配置

不同命令生成的事件

过期事件计时

事件集群

Redis 系列(二十六):Redis 键空间通知特性

http://blog.gxitsky.com/2021/03/11/Redis-26-keyspace-notice/

作者

光星

发布于

2021-03-11

更新于

2022-11-04

许可协议

评论