Redis从2.8.0版本后,推出 Keyspace Notifications 特性。
Keyspace Notifications 此特性允许客户端可以以 订阅/发布(Sub/Pub)模式,接收那些对数据库中的键和值有影响的操作事件。这些操作事件具体来说,就是 del , expire , set , rpop等啦。
接收到的事件的类型只有两种: keyspace 和 keyevent。
前者为事件的具体操作,后者为事件影响的键名。比如我们删除一个叫 mykey 的键。
127.0.0.1:6379> del mykey
数据库0会发布以下两个信息
PUBLISH __keyspace@0__:mykey del
PUBLISH __keyevent@0__:del mykey
很容易看到,第一条信息的通道名称有 keyspace 前缀,是 keyspace 类型,内容为具体操作 del 。第二条信息的通道名称有 keyevent 前缀,是 keyevent 类型,内容为影响的键名 mykey 。
Keyspace Notifications 空间通知特性的开启这里需要修改redis的配置文件redis.conf,使此特性开启。默认情况下,redis是不开启此特性的。
首先找到 redis.conf (我的配置文件是在 /usr/local/redis/etc/ 路径下),vim 打开,搜索一下 notify-keyspace-events。
可以下看到如下
notify-keyspace-events ""
双引号内参数为空,表示默认为不开启的设置。参数不为空则表示开启此特性。参数的配置,是以字符组合为准。每个字符(注意大小写)对应允许的操作,如下表。
K Keyspace events, published with __keyspace@<db>__ prefix.
E Keyevent events, published with __keyevent@<db>__ prefix.
g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...
$ String commands
l List commands
s Set commands
h Hash commands
z Sorted set commands
x Expired events (events generated every time a key expires)
e Evicted events (events generated when a key is evicted for maxmemory)
A Alias for g$lshzxe, so that the "AKE" string means all the events.
比如 参数配置为 KEg
notify-keyspace-events "KEg"
则所有非数据类型(del , expire 等)的操作,都会 发布 keyspace 和 keyevent 两种类型的消息。
比如 参数配置为 Kh
notify-keyspace-events "Kh"
则所有hash数据类型的操作,都会 发布 keyspace 类型的消息。
字符 K 代表 Keyspace,表示 Keyspace 类型的消息。字符 E 代表 Keyevent ,表示 Keyevent 类型的消息。
注意:K 和 E 至少有一个存在,要不然就发布不了任何类型的消息。
这里我们最终把参数设置为 KEA,表示会发布所有操作的事件消息。
notify-keyspace-events "KEA"
这里还需要重启一下redis的服务,使配置文件生效。
[root@chokingwin etc]# service redis-server restart /usr/local/redis/etc/redis.conf
Stopping redis-server: [ OK ]
Starting redis-server: [ OK ]
接收键空间的通知
开启一个终端,redis-cli 进入 redis 。开始订阅所有操作,等待接收消息。
[root@chokingwin etc]# redis-cli
127.0.0.1:6379> psubscribe __key*@0__:*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__key*@0__:*"
3) (integer) 1
*说明:psubscribe __key@0__: 是指定订阅两种消息类型和所有操作类型的写法**
再开启一个终端,redis-cli 进入 redis ,设置一个string类型的Key,其值为 chokingwin。
[root@chokingwin etc]# redis-cli
127.0.0.1:6379> set name chokingwin
OK
随即就会看到,另外一边执行了阻塞订阅操作后的终端,有如下信息输出
1) "pmessage"
2) "__key*@0__:*"
3) "__keyspace@0__:name"
4) "set"
1) "pmessage"
2) "__key*@0__:*"
3) "__keyevent@0__:set"
4) "name"
说明键空间消息的接收,是成功的 ^ - ^。
热门评论
非常O(∩_∩)O谢谢,我集成到tp5里面了
请问这个有什么实际的应用场景吗