为了账号安全,请及时绑定邮箱和手机立即绑定

Redis 的keyspace notification(键空间通知) 初探

标签:
PHP 数据结构
Keyspace Notifications(键空间通知)

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"

说明键空间消息的接收,是成功的 ^ - ^。

点击查看更多内容
6人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消