数据库通知是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命令,订阅数据库通知的客户端收到的信息就是由这个函数发出的.