Redis Keyspace Notification的说明应用
这个特性大概是,凡是实现了Redis的Pub/Sub的客户端,只需要订阅相应Channel,就可以获得对Key操作的一些事件,从而可以处理一些业务。
比如:
1、当你del一个key时,就可以触发一个del事件通知。
2、一个key的失效时间到了,就会触发expire事件通知。
3、对一个库所有key操作,都可以获取通知。比如对0库所有key的操作。
因为这个特性实际使用的是Redis的Pub/Sub机制,这个机制并不可靠,是“Forget”模式,就是消息发出去不保证会被消费,所以要是业务非常依赖这个Notification的话,
则不建议使用。实际上,目前公司的不少业务就是依靠Pub/Sub机制来做的,性能还是不错,能允许少量消息丢失。
触发事件的类型:
Keyspace Notifications 对要监听的key的操作,会通过2个Channel发出2个不同的消息的,假如对一个String类型,mykey的key进行del操作,就会发2条消息,类似下面的
PUBLISH __keyspace@0__:mykey del
PUBLISH __keyevent@0__:del mykey
假如客户端订阅了这2个channel,就会监听到消息的。
这2条消息,一个称为,Key-space notification 其实是收到对key操作的事件的名称,比如del操作,会收到的是“del”字符串
另一个称为,Key-event notification 这个是收到对哪个key的操作,比如刚才执行del操作,会收到“mykey”字符串。
当然这2条消息,通过配置,可以指定收到哪些消息。比如,我只要 keyevent 的消息。
这个后面做实验的时候,就可以很清晰的看到了。
如何配置:
redis默认是关闭这个特性的,因为打开这个特性,会消耗一定的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.
给几个配置例子:
1、需要获取所有key的事件及哪些key触发了事件
notify-keyspace-events KEA
2、需要获取哪些key失效时触发事件
notify-keyspace-events Ex
3、需要获取一些普通key的事件
notify-keyspace-events Kg
实践操作:
先配置这样 notify-keyspace-events KEg
1、先set一个key mykey,然后del
127.0.0.1:6379> set mykey 100
OK
127.0.0.1:6379> del mykey
2、匹配监听 '__key*__:*',就可以看到下面收到2条消息,keyspace收到的字符串“del”,keyevent收到的字符串“mykey”
127.0.0.1:6379> psubscribe '__key*__:*'
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__key*__:*"
3) (integer) 1
1) "pmessage"
2) "__key*__:*"
3) "__keyspace@0__:mykey"
4) "del"
1) "pmessage"
2) "__key*__:*"
3) "__keyevent@0__:del"
4) "mykey"
实际情况中 notify-keyspace-events Ex ,这样的是比较实用的,当某个key失效的时候收到消息,就可以处理相关的业务。
比如,当用户由于中奖获得了某个权利,这个权利有效时间是2小时;2小时候后,这个权利就必须去掉,还要处理一些业务逻辑统计之类,
那这个特性就派上用场了。
凡事有利有弊,由于开启了这个特性,就需要耗费一定资源。具体影响多大,需要更深一步调查了。
评论
发表评论
|
|