前言

  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

  

redis空间键详解的更多相关文章

  1. Redis AOF 持久化详解

    Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多.但是一旦进程退出,Redis 的数据就会丢失. 为了解决这个问题,Redis 提供了 RDB 和 ...

  2. [转]Reids配置文件redis.conf中文详解

    转自: Reids配置文件redis.conf中文详解 redis的各种配置都是在redis.conf文件中进行配置的. 有关其每项配置的中文详细解释如下: 对应的中文版解释redis.conf # ...

  3. [转]Redis内部数据结构详解-sds

    本文是<Redis内部数据结构详解>系列的第二篇,讲述Redis中使用最多的一个基础数据结构:sds. 不管在哪门编程语言当中,字符串都几乎是使用最多的数据结构.sds正是在Redis中被 ...

  4. Python操作redis字符串(String)详解 (三)

    # -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...

  5. 探索Redis设计与实现6:Redis内部数据结构详解——skiplist

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  6. 探索Redis设计与实现7:Redis内部数据结构详解——intset

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  7. 探索Redis设计与实现5:Redis内部数据结构详解——quicklist

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  8. 探索Redis设计与实现4:Redis内部数据结构详解——ziplist

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  9. 探索Redis设计与实现3:Redis内部数据结构详解——sds

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

随机推荐

  1. 解决spring mybatis 整合后mapper接口注入失败

    spring整合mybatis,在dao层我们只写一个接口,配置相应的*mapper.xml文件, 报如下错误: org.springframework.beans.factory.Unsatisfi ...

  2. 2018杭电多校第六场1009(DFS,思维)

    #include<bits/stdc++.h>using namespace std;int a[100010];char s[20];int zhiren[100010];vector& ...

  3. kylin cube 构建过程

    本文是对 http://kylin.apache.org/docs20/howto/howto_optimize_build.html的翻译,以便阅读. 1.  创建 Hive 中间表(Create ...

  4. 死磕 java同步系列之synchronized解析

    问题 (1)synchronized的特性? (2)synchronized的实现原理? (3)synchronized是否可重入? (4)synchronized是否是公平锁? (5)synchro ...

  5. SP1716 GSS3

    题意翻译 \(n\) 个数,\(q\) 次操作 操作\(0\) \(x\) \(y\)把\(A_x\) 修改为\(y\) 操作\(1\) \(l\) \(r\)询问区间\([l, r]\)的最大子段和 ...

  6. JMeter - 实时结果 - InfluxDB和Grafana - 第2部分 - 添加自定义字段

    我已经使用InfluxDB + Grafana来获取我的JMeter测试的实时结果.您可以在此处找到有关基本设置的更多详细信息.在本文中,让我们看看我们如何在InfluxDB测量中添加一些自定义字段, ...

  7. Docker基础 :网络配置详解

    本篇文章将讲述 Docker 的网络功能,包括使用端口映射机制来将容器内应用服务提供给外部网络,以及通过容器互联系统让多个容器之间进行快捷的网络通信,有兴趣的可以了解下. 大量的互联网应用服务包含多个 ...

  8. GUI的最终选择 Tkinter(四):Entry、Listbox、Scrollbar和Scale组件

    Entry组件 Entry组件就是平时所说的输入框.输入框是程序员用到的最多的一个程序,例如在输入账号和密码的时候需要提供两个输入框,用于接收密码的输入框还会有星号将实际输入的内容隐藏起来. Tkin ...

  9. @Inherited:允许子类继承父类的注解。

    在看定义注解的相关文章的时候,看到这个@Inherited注解,简单的说明并没有真正搞懂是什么意思.在网上搜索了一些相关的内容,现在把一篇文章转载过来.以便后面使用. 文章出处,转载地址:(http: ...

  10. Linux网络管理命令ifdown/ifup与ifconfig/ip中的down/up命令的对比

    参考了:https://blog.csdn.net/GDUTLYP/article/details/50498202 以下网卡均采用eth1说明. 相同点——[启用]和[禁止]网卡 ifdown et ...