前言
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