Redis Keyspace Notification的说明应用

  |   0 评论   |   4,787 浏览
    自从redis2.8以后出了一个新特性,Keyspace Notifications 称为“键空间通知”。


    这个特性大概是,凡是实现了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小时候后,这个权利就必须去掉,还要处理一些业务逻辑统计之类,
    那这个特性就派上用场了。
    凡事有利有弊,由于开启了这个特性,就需要耗费一定资源。具体影响多大,需要更深一步调查了。

    评论

    发表评论

    validate