redis数据库通知

数据库通知是Redis2.8版本新增加的功能,这个功能可以让客户端通过订阅给定的频道或者模式,来获知数据库中键的变化,以及数据库中命令的执行情况。
举个例子,以下代码展示了客户端如何获取0号数据库中针对message键执行的所有命令:

复制代码
127.0.0.1:6379>SUBSCRIBE__keyspace@0__:message
Reading messages . . . (press Ctrl-C to quit)
1) "subscribe"            //订阅信息
2) "_ _keyspace@0_:message"
3) (integer) 1
1) "message" //执行SET 命令
2) "_ _keyspace@0_: message"
3) "set"
1) "message" //执行EXPIE命令
2) " keyspace@0_:message"
3) "expire"
1) "message" //执行DEL 命令
2) "_ _keyspace@0_: message "
3) "de1"
复制代码

根据发回的通知显示,先后共有SET、EXPlRE 、DEL 三个命令对键message进行了操作。

这一类关注"某个键执行了什么命令"的通知称为键空间通知(key-space-notification),除此之外,还有另一类称为键事件通知(key-event-notification)的通知,它们关注的是"某个命令被什么键执行了" 。
以下是一个键事件通知的例子,代码展示了客户端如何获取0 号数据库中所有执行DEL 命令的键:

复制代码
127.0 . 0.1:6379> SUBSCRIBE_ _keyevent@0_ _:de1
Reading messages. . . (press Ctrl-C to quit)
1) "subcribe"                      //订阅信息
2) "_ _keyevent@0_ _:del"
3) (integer) 1

1) "message"                     //键key执行了DEL命令
2) "keyevent@0_ _:del"
3) "key"

1) "message"                     //键number执行了DEL命令
2) "_ _keyevent@0_ _:del"
3) "number"

1) "message"                     //键message执行了DEL命令
2) "keyevent@0_ _:del"
3) "message"
复制代码

根据发回的通知显示,key、number、message三个键先后执行了DEL 命令。
服务器配置的notify-keyspace-events选项决定了服务器所发送通知的类型:

想让服务器发送所有类型的键空间通知和键事件通知,可以将选项的值设置为AKE。
想让服务器发送所有类型的键空间通知,可以将选项的值设置为AK。
想让服务器发送所有类型的键事件通知,可以将选项的值设置为AE。
想让服务器只发送和字符串键有关的键空间通知,可以将选项的值设置为K$。
想让服务器只发送和列表键有关的键事件通知,可以将选项的值设置为E1。

关于数据库通知功能的详细用法,以及notify-keyspace-events选项的更多设置,Redis 的官方文档已经做了很详细的介绍,这里不再赘述。

发送通知的实现

以下是notifyKeyspaceEvent函数的伪代码实现:

复制代码
def notifyKeyspaceEvent(type,event,key,dbid):
#如果给定的通知不是服务器允许发送的通知,那么直接返回
if not(server.notify_keyspace_events&type) :
  return
#发送键空间通知
if server.notify_keyspace_events&REDIS_NOTIFY_KEYSPACE:
#将通知发送给频道__ keyspace@<dbid>__ :<key>
#内容为键所发生的事件<event>
#构建频道名字
chan="keyspace@{dbid}:{key}".format (dbid=dbid,key=key)
#发送通知
pubsubPublishMessage(chan,event)
#发送键事件通知
if server.notify_keyspace_events&REDIS_NOTIFY_KEYEVENT:
#将通知发送给频道_keyevent@<dbid>_:<event>
#内容为发生事件的键<key>
#构建频道名字
chan="keyevent@{dbid}:{event}".format(dbid=dbid, event=event)
#发送通知
pubsubPublishMessage(chan, key)
复制代码

1) server.notify_keyspace_events属性就是服务器配置notify-keyspace-events选项所设置的值,如果给定的通知类型type不是服务器允许发迭的通知类型,那么函数会直接返回,不做任何动作。

2) 如果给定的通知是服务器允许发送的通知,那么下一步函数会检测服务器是否允许发送键空间通知,如果允许的话,程序就会构建并发送事件通知。

3 )最后,函数检测服务器是否允许发送键事件通知,如果允许的话,程序就会构建并发送事件通知。

另外,pubsubPublishMessage函数是PUBL1SH命令的实现函数,执行这个函数等同于执行PUBL1SH命令,订阅数据库通知的客户端收到的信息就是由这个函数发出的.

猜你喜欢

转载自blog.csdn.net/yangyang_01/article/details/80494171