Redis键空间通知(keyspace notification)

本文档翻译自: http://redis.io/topics/notifications 。

键空间通知功能目前仍在开发中,这个文档所描述的内容,以及功能的具体实现,可能会在未来数周内改变,敬请知悉。

功能概览

键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件。

以下是一些键空间通知发送的事件的例子:

  • 所有修改键的命令。
  • 所有接收到 LPUSH 命令的键。
  • 0 号数据库中所有已过期的键。

事件通过 Redis 的订阅与发布功能(pub/sub)来进行分发, 因此所有支持订阅与发布功能的客户端都可以在无须做任何修改的情况下, 直接使用键空间通知功能。

因为 Redis 目前的订阅与发布功能采取的是发送即忘(fire and forget)策略, 所以如果你的程序需要可靠事件通知(reliable notification of events), 那么目前的键空间通知可能并不适合你: 当订阅事件的客户端断线时, 它会丢失所有在断线期间分发给它的事件。

未来将会支持更可靠的事件分发, 这种支持可能会通过让订阅与发布功能本身变得更可靠来实现, 也可能会在 Lua 脚本中对消息(message)的订阅与发布进行监听, 从而实现类似将事件推入到列表这样的操作。

事件的类型

对于每个修改数据库的操作,键空间通知都会发送两种不同类型的事件。

比如说,对 0 号数据库的键 mykey 执行 DEL 命令时, 系统将分发两条消息, 相当于执行以下两个 PUBLISH 命令:

PUBLISH __keyspace@0__:mykey del
PUBLISH __keyevent@0__:del mykey

订阅第一个频道 __keyspace@0__:mykey 可以接收 0 号数据库中所有修改键 mykey 的事件, 而订阅第二个频道 __keyevent@0__:del 则可以接收 0 号数据库中所有执行 del 命令的键。

以 keyspace 为前缀的频道被称为键空间通知(key-space notification), 而以 keyevent 为前缀的频道则被称为键事件通知(key-event notification)。

当 del mykey 命令执行时:

  • 键空间频道的订阅者将接收到被执行的事件的名字,在这个例子中,就是 del 。
  • 键事件频道的订阅者将接收到被执行事件的键的名字,在这个例子中,就是 mykey 。

配置

因为开启键空间通知功能需要消耗一些 CPU , 所以在默认配置下, 该功能处于关闭状态。

可以通过修改 redis.conf 文件, 或者直接使用 CONFIG SET 命令来开启或关闭键空间通知功能:

  • 当 notify-keyspace-events 选项的参数为空字符串时,功能关闭。
  • 另一方面,当参数不是空字符串时,功能开启。

notify-keyspace-events 的参数可以是以下字符的任意组合, 它指定了服务器该发送哪些类型的通知:

字符 发送的通知
K 键空间通知,所有通知以 __keyspace@<db>__ 为前缀
E 键事件通知,所有通知以 __keyevent@<db>__ 为前缀
g DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知
$ 字符串命令的通知
l 列表命令的通知
s 集合命令的通知
h 哈希命令的通知
z 有序集合命令的通知
x 过期事件:每当有过期键被删除时发送
e 驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送
A 参数 g$lshzxe 的别名

输入的参数中至少要有一个 K 或者 E , 否则的话, 不管其余的参数是什么, 都不会有任何通知被分发。

举个例子, 如果只想订阅键空间中和列表相关的通知, 那么参数就应该设为 Kl , 诸如此类。

将参数设为字符串 "AKE" 表示发送所有类型的通知。

命令产生的通知

以下列表记录了不同命令所产生的不同通知:

  • DEL 命令为每个被删除的键产生一个 del 通知。
  • RENAME 产生两个通知:为来源键(source key)产生一个 rename_from 通知,并为目标键(destination key)产生一个 rename_to 通知。
  • EXPIRE 和 EXPIREAT 在键被正确设置过期时间时产生一个 expire 通知。当 EXPIREAT 设置的时间已经过期,或者 EXPIRE 传入的时间为负数值时,键被删除,并产生一个 del 通知。
  • SORT 在命令带有 STORE 参数时产生一个 sortstore 事件。如果 STORE 指示的用于保存排序结果的键已经存在,那么程序还会发送一个 del 事件。
  • SET 以及它的所有变种(SETEX 、 SETNX 和 GETSET)都产生 set 通知。其中 SETEX 还会产生 expire 通知。
  • MSET 为每个键产生一个 set 通知。
  • SETRANGE 产生一个 setrange 通知。
  • INCR 、 DECR 、 INCRBY 和 DECRBY 都产生 incrby 通知。
  • INCRBYFLOAT 产生 incrbyfloat 通知。
  • APPEND 产生 append 通知。
  • LPUSH 和 LPUSHX 都产生单个 lpush 通知,即使有多个输入元素时,也是如此。
  • RPUSH 和 RPUSHX 都产生单个 rpush 通知,即使有多个输入元素时,也是如此。
  • RPOP 产生 rpop 通知。如果被弹出的元素是列表的最后一个元素,那么还会产生一个 del 通知。
  • LPOP 产生 lpop 通知。如果被弹出的元素是列表的最后一个元素,那么还会产生一个 del 通知。
  • LINSERT 产生一个 linsert 通知。
  • LSET 产生一个 lset 通知。
  • LTRIM 产生一个 ltrim 通知。如果 LTRIM 执行之后,列表键被清空,那么还会产生一个 del 通知。
  • RPOPLPUSH 和 BRPOPLPUSH 产生一个 rpop 通知,以及一个 lpush 通知。两个命令都会保证 rpop 的通知在 lpush 的通知之前分发。如果从键弹出元素之后,被弹出的列表键被清空,那么还会产生一个 del 通知。
  • HSET 、 HSETNX 和 HMSET 都只产生一个 hset 通知。
  • HINCRBY 产生一个 hincrby 通知。
  • HINCRBYFLOAT 产生一个 hincrbyfloat 通知。
  • HDEL 产生一个 hdel 通知。如果执行 HDEL 之后,哈希键被清空,那么还会产生一个 del 通知。
  • SADD 产生一个 sadd 通知,即使有多个输入元素时,也是如此。
  • SREM 产生一个 srem 通知,如果执行 SREM 之后,集合键被清空,那么还会产生一个 del 通知。
  • SMOVE 为来源键(source key)产生一个 srem 通知,并为目标键(destination key)产生一个 sadd 事件。
  • SPOP 产生一个 spop 事件。如果执行 SPOP 之后,集合键被清空,那么还会产生一个 del 通知。
  • SINTERSTORE 、 SUNIONSTORE 和 SDIFFSTORE 分别产生 sinterstore 、 sunionostore 和 sdiffstore 三种通知。如果用于保存结果的键已经存在,那么还会产生一个 del 通知。
  • ZINCRBY 产生一个 zincr 通知。(译注:非对称,请注意。)
  • ZADD 产生一个 zadd 通知,即使有多个输入元素时,也是如此。
  • ZREM 产生一个 zrem 通知,即使有多个输入元素时,也是如此。如果执行 ZREM 之后,有序集合键被清空,那么还会产生一个 del 通知。
  • ZREMRANGEBYSCORE 产生一个 zrembyscore 通知。(译注:非对称,请注意。)如果用于保存结果的键已经存在,那么还会产生一个 del 通知。
  • ZREMRANGEBYRANK 产生一个 zrembyrank 通知。(译注:非对称,请注意。)如果用于保存结果的键已经存在,那么还会产生一个 del 通知。
  • ZINTERSTORE 和 ZUNIONSTORE 分别产生 zinterstore 和 zunionstore 两种通知。如果用于保存结果的键已经存在,那么还会产生一个 del 通知。
  • 每当一个键因为过期而被删除时,产生一个 expired 通知。
  • 每当一个键因为 maxmemory 政策而被删除以回收内存时,产生一个 evicted 通知。

所有命令都只在键真的被改动了之后,才会产生通知。

比如说,当 SREM 试图删除不存在于集合的元素时,删除操作会执行失败,因为没有真正的改动键,所以这一操作不会发送通知。

如果对命令所产生的通知有疑问, 最好还是使用以下命令, 自己来验证一下:

$ redis-cli config set notify-keyspace-events KEA
$ redis-cli --csv psubscribe '__key*__:*'
Reading messages... (press Ctrl-C to quit)
"psubscribe","__key*__:*",1

然后, 只要在其他终端里用 Redis 客户端发送命令, 就可以看到产生的通知了:

"pmessage","__key*__:*","__keyspace@0__:foo","set"
"pmessage","__key*__:*","__keyevent@0__:set","foo"
...

过期通知的发送时间

Redis 使用以下两种方式删除过期的键:

  • 当一个键被访问时,程序会对这个键进行检查,如果键已经过期,那么该键将被删除。
  • 底层系统会在后台渐进地查找并删除那些过期的键,从而处理那些已经过期、但是不会被访问到的键。

当过期键被以上两个程序的任意一个发现、 并且将键从数据库中删除时, Redis 会产生一个 expired 通知。

Redis 并不保证生存时间(TTL)变为 0 的键会立即被删除: 如果程序没有访问这个过期键, 或者带有生存时间的键非常多的话, 那么在键的生存时间变为 0 , 直到键真正被删除这中间, 可能会有一段比较显著的时间间隔。

因此, Redis 产生 expired 通知的时间为过期键被删除的时候, 而不是键的生存时间变为 0 的时候。

from: http://redisdoc.com/topic/notification.html

键空间通知(keyspace notification)相关推荐

  1. Redis键空间通知(Keyspace Notifications)

    Redis Keyspace Notifications https://redis.io/topics/notifications Redis 是一个键值对数据库服务器,服务器中每个数据库都由 re ...

  2. 大神教你实现redis键空间通知

    最近在开发一个定时活动,而且活动是多个场次的.这个是后就需要在活动开始的时候推送信息给客户端,结束的时候也要推送一次.简单的设计方案就是将配置缓存在redis,然后每隔一秒就轮询reids,获取配置信 ...

  3. 集群空间服务器接收不到消息,解决Redis集群条件下键空间通知服务器接收不到消息的问题...

    解决Redis集群条件下键空间通知服务器接收不到消息的问题 键空间通知介绍 键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件. 可以通过对redis的 ...

  4. Redis实践操作之—— keyspace notification(键空间通知)

    源码地址:https://github.com/Tinywan/PHP_Experience 一.需求分析: 设置了生存时间的Key,在过期时能不能有所提示? 如果能对过期Key有个监听,如何对过期K ...

  5. springboot 整合redis 实现KeySpaceNotification 键空间通知

    2019独角兽企业重金招聘Python工程师标准>>> 目录结构如下: application.properties配置文件(redis的配置): spring.redis.host ...

  6. iOS 远程通知(Remote Notification)和本地通知(Local Notification)

    ios通知分为远程通知和本地通知,远程通知需要连接网络,本地通知是不需要的,不管用户是打开应用还是关闭应用,我们的通知都会发出,并被客户端收到 我们使用远程通知主要是随时更新最新的数据给用户,使用本地 ...

  7. 最好用的 6 款 Vue 实时消息提示通知(Message/Notification)组件推荐与测评

    本文完整版:<最好用的 6 款 Vue 实时消息提示通知(Message/Notification)组件推荐与测评> Vue 实时消息提示通知 Vue-notification - 专注实 ...

  8. 常规通知(Notification)模板

    // 得到通知管理者 NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICA ...

  9. Android 8.0 创建管理通知渠道Notification

    从Android8.0(API26)开始,所有的通知必须分配一个渠道.每一个渠道,你都可以设置渠道中所有通知的视觉和听觉行为.然后,用户能够随意修改这些设置来决定通知的行为. 在用户界面渠道显示为 & ...

最新文章

  1. 服务器开机修改grub,修改 grub
  2. java数据结构教程_Java数据结构
  3. Flash 组件定义(AS3)
  4. 开源Math.NET基础数学类库使用(11)C#计算相关系数
  5. pythonlbp纹理提取_Python + OpenCV 实现LBP特征提取的示例代码
  6. java代码中哪些不能犯的错误_Java程序员工作中千万不能犯的3个低级错误
  7. 如何将存储在MongoDB数据库中的数据导出到Excel中?
  8. C#循环 — break VS continue
  9. 微软将 Teams 移动应用纳入漏洞奖励计划,最高奖金3万美元
  10. 编写通用 Hello World 驱动程序 (KMDF)
  11. Device Mapper Multipath(DM-Multipath)
  12. SHIFT-JIS编码范围
  13. php网页顶部菜单代码,5款个性的网页回到顶部特效代码
  14. 如何更改 think-cell 图表的默认颜色?
  15. malloc函数详解以及例程
  16. Ouroboros:A Provably Secure Proof-of-Stake Blockchain Protocol 学习总结
  17. ts 使用infer 推断类型
  18. FreeDOM —— 一个可迁移的网页信息抽取模型
  19. DS1302实时时钟
  20. 创新案例分享 | 医院DRG系统建设项目,助力精细化分析医疗数据

热门文章

  1. 消费金融首推即时沟通工具“马上”探索科技金融发展新方向
  2. Lesson 9.5 从0实现多层神经网络的正向传播
  3. 关于Linux Kernel中的宏定义likely和unlikely
  4. 为什么使用 Vuetify?
  5. 李彦宏透露百度真正的护城河
  6. CPU_X86架构和ARM架构入门篇
  7. 白话Elasticsearch18-深度探秘搜索技术之基于slop参数实现近似匹配以及原理剖析
  8. CSS基础_Day04
  9. 可视化_仓库管理可视化
  10. nav 计算机网络_CTO下载-计算机网络课件(配套韩立刚老师课程).ppt