Redis的keyspace notification(键空间通知)实践

日期: 2018-08-29         浏览量: 5156


应用场景


    类似微信红包功能24小时无人领取自动退还红包


redis键空间通知(keyspace notifications)


    Redis的键空间通知(keyspace notifications)功能是自2.8.0版本开始加入的,客户端可以通过订阅/发布(Pub/Sub)机制,接收那些以某种方式改变了Redis数据空间的事件通知。比如:所有改变给定key的命令;所有经过lpush操作的key;所有在0号数据库中过期的key等等。

    通知是通过Redis的订阅/发布机制发送的,因此,所有支持订阅/发布功能的客户端都可在无需调整的情况下,使用键空间通知功能。


redis服务端配置
    

    修改配置文件redis.conf中的:notify-keyspace-events Ex,默认为 # notify-keyspace-events "" 。

        # K Keyspace事件,以__keyspace@<db>__前缀发布。

        # E Keyevent事件,以__keyevent@<db>__前缀发布。

        # g泛型命令(非类型特定的),比如DEL, EXPIRE, RENAME,…

        # $ String命令

        # l命令列表

        #年代设置命令

        # h散列的命令

        # z排序集命令

        # x过期事件(每次键过期都会生成事件)

        # e退出事件(退出maxmemory键时生成的事件)

        # g$lshzxe的别名,因此“AKE”字符串表示所有事件。


测试


    Redis发布所有通知,客户端A订阅所有消息:   

    

     


    在客户端B上执行setex


        


    然后客户端A的打印如下:


    


代码实现 (node)简单版


const Redis = require('ioredis');
const redis = new Redis({
    port: 6379,
    host: '127.0.0.1',
    family: 4,
    password: '888888',
    db: 0
});
const redisSet = new Redis({
    port: 6379,
    host: '127.0.0.1',
    family: 4,
    password: '888888',
    db: 0
});
//设置hello 10秒过期
redisSet.setex('hello', '10', '你好')
//订阅给定模式相匹配的所有频道
redis.psubscribe('__key*@0__:*', function (err, count) {
    console.log(err)    //NULL
    console.log(count)  //1
});
//监听消息10秒后会输出 (可以根据key 处理相关业务 例如 24小时到期后退回红包)
redis.on('pmessage', function (pattern, channel, message) {
    console.log(pattern)  //__key*@0__:*
    console.log(channel)  //__keyevent@0__:expired
    console.log(message)  //hello
});