zoukankan      html  css  js  c++  java
  • redis空间键详解

    前言

      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
    

      

  • 相关阅读:
    使用公用表表达式的递归查询
    cocos2d-x 精灵的创建和基本使用
    全栈project师的毁与誉
    使用zTree和json构建简单树节点
    使用贝赛尔曲线画扇形、圆形、弧线、多边形,实现App下载时的动画效果demo
    UIBezierPathStudyDemo
    iOS-swift环形进度指示器+图片加载动画
    IOS之以UIBezierPath绘制饼状图
    Swift之UIBezierPath
    swift app中展示折线图, 饼状图, 柱状图等数据图表
  • 原文地址:https://www.cnblogs.com/y-yxh/p/7646838.html
Copyright © 2011-2022 走看看