redis空間鍵詳解

前言

  redis的空間鍵通知是在2.8.0版本之後加入的,客戶端經過發佈訂閱的方式,訂閱某個頻道,接收經過某種方式影響redis中數據的事件.redis

目錄:

  1.空間鍵事件分類

  2.如何啓用redis的空間鍵通知

  3.命令行操做示例

  4.ioredis操做示例

1.空間鍵事件分類

  每個影響redis數據空間的操做,都會產生兩種事件,分別是key-space和key-event事件
瀏覽器

  key-space是用來接收影響redis數據空間的操做的名稱,如set, lpushapp

  key-event是用來接收受影響的鍵值名稱koa

 

2.如何啓用redis的空間鍵通知

  爲了減小cpu性能的損耗,redis的空間鍵通知默認是關閉的(notify-keyspace-events爲空),能夠經過以下方式啓用redis空間鍵通知:性能

  1)修改redis.conf中notify-keyspace-events的值,如:notify-keyspace-events 'K$'ui

  2)經過config set命令設置notify-keyspace-events的值,如:config set notify-keyspace-events 'K$'spa

  notify-keyspace-events的值爲空,表示禁用空間鍵通知,若爲非空,則啓用該功能,非空能夠由多個特定的字符組成,這些字符的含義以下:命令行

    K Keyspace events, published with __keyspace@<db>__ prefix. 表示啓用key-space事件code

    E  Keyevent events, published with __keyevent@<db>__ prefix. 表示啓用key-event事件blog

    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
相關文章
相關標籤/搜索