客户端可以订阅特定的PUB/SUB 通道,当redis的dataset 发生改变时,redis就会向这些通道发送通知。会发送通知的操作如下
收到LPUSH命令的key
在database0过期的key
redis的订阅功能不可靠,如果订阅了某个通道的客户端断开了连接,那么及时后面这个客户端重新连接,断线期间的通知客户端也收不到了,所以如果你的系统要求可靠的通知,那么不建议使用redis。
1、keyspace通知由两个方面组成,每个影响dataset的操作,都会向两个通道发送通知,一个通道表示执行了什么操作,另一个通道表示操作了哪个key。例如在database0 执行DEL mykey 命令,会触发两条消息
PUBLISH __keyspace@0__:mykey del
PUBLISH __keyevent@0__:del mykey
keyspace 通道收到的消息内容是操作的类型
keyevent 通道收到的消息内容是 操作的key的name
这两个通道可以配置是否开启。
2、通知配置
默认情况下,keypace通道的通知是被禁止的,因为这个通知耗费cpu资源。
在redis.conf 中配置开启哪些通知,格式: 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.
如果参数为空,表示关闭这个功能。如要开启通知功能,参数中必须要有K或A,否则即使带上其它的参数也是无效的。
3、如何测试订阅通知
$ redis-cli config set notify-keyspace-events KEA
$ redis-cli --csv psubscribe '__key*__:*'
Reading messages... (press Ctrl-C to quit)
"psubscribe","__key*__:*",1
在其他的窗口中,执行SET foo hello命令
"pmessage","__key*__:*","__keyspace@0__:foo","set"
"pmessage","__key*__:*","__keyevent@0__:set","foo"
...