前言
redis的空间键通知是在2.8.0版本以后加入的,客户端通过发布订阅的方式,订阅某个频道,接收通过某种方式影响redis中数据的事件.
目录:
1.空间键事件分类
2.如何启用redis的空间键通知
3.命令行操作示例
4.ioredis操作示例
1.空间键事件分类
每一个影响redis数据空间的操作,都会产生两种事件,分别是key-space和key-event事件
key-space是用来接收影响redis数据空间的操作的名称,如set, lpush
key-event是用来接收受影响的键值名称
2.如何启用redis的空间键通知
为了减少cpu性能的损耗,redis的空间键通知默认是关闭的(notify-keyspace-events为空),可以通过如下方式启用redis空间键通知:
1)修改redis.conf中notify-keyspace-events的值,如:notify-keyspace-events 'K$'
2)通过config set命令设置notify-keyspace-events的值,如:config set notify-keyspace-events 'K$'
notify-keyspace-events的值为空,表示禁用空间键通知,若为非空,则启用该功能,非空可以由多个特定的字符组成,这些字符的含义如下:
K Keyspace events, published with __keyspace@<db>__ prefix. 表示启用key-space事件
E Keyevent events, published with __keyevent@<db>__ prefix. 表示启用key-event事件
g 一般性的指令,比如del(删除),expire(过期),rename(重命名)
$ 字符特定串命令
l 列表特定命令
s 集合特定命令
h hash特定命令
z 有序集合特定命令
x 过期事件
e 驱逐事件
A g$lshzxe的别名
例如设置notify-keyspace-events 'Kl' 表示仅仅对列表命令响应key-space事件(不响应key-event事件)
3.命令行操作示例
首先设置notify-keyspace-events 'K$'
在客户端A上执行:
127.0.0.1:6379> psubscribe __keyspace*@0__:test Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "__keyspace*@0__:test" 3) (integer) 1
在客户端B上执行:
127.0.0.1:6379> set test 1 OK
则在客户端A上会输出:
1) "pmessage" 2) "__keyspace*@0__:test" 3) "__keyspace@0__:test" 4) "set"
可见客户端A收到了key-space事件,而这个事件是通过客户端B set test 1产生的
4.ioredis操作示例
客户端A:
const Redis = require('ioredis') const Koa = require('koa') let app = new Koa() let client = new Redis({host: 'localhost', port: 6379}) app.use(function* (next) { client.setex('test:1111', 5, 'qqq') }) app.listen(3000)
客户端B:
const Koa = require('koa') const Redis = require('ioredis') const co = require('co') let app = new Koa() let client = new Redis({host: 'localhost', port: 6379}) let client2 = client.duplicate(); client.psubscribe('__keyspace@0__:test:*') client.on('pmessage', function (event, data, data1) { let ttt = function* () { let data2 = yield client2.get('qqqq') } co(ttt) }) app.listen(3001)
client.psubscribe('__keyspace@0__:test:*') 匹配所有对test:开头的键的操作
注意: 这里如果想要使用redis的普通指令,则需要重新生成一个redis实例,这里可以通过client.duplicate()来生成一个配置相同的redis实例
分别启动客户端A和客户端B,在浏览器中输入localhost:3000,可以看到客户端B输出如下信息:
__keyspace@0__:test:* __keyspace@0__:test:1111 set