REDIS key notification
Redis Keyspace Notifications
IMPORTANT Keyspace notifications is a feature available since 2.8.0
Feature overview
Keyspace notifications allows clients to subscribe to Pub/Sub channels in order to receive events affecting the Redis data set in some way.
Examples of the events that is possible to receive are the following:
- All the commands affecting a given key.
- All the keys receiving an LPUSH operation.
- All the keys expiring in the database 0.
Events are delivered using the normal Pub/Sub layer of Redis, so clients implementing Pub/Sub are able to use this feature without modifications.
Because Redis Pub/Sub is fire and forget currently there is no way to use this feature if you application demands reliable notification of events, that is, if your Pub/Sub client disconnects, and reconnects later, all the events delivered during the time the client was disconnected are lost.
In the future there are plans to allow for more reliable delivering of events, but probably this will be addressed at a more general level either bringing reliability to Pub/Sub itself, or allowing Lua scripts to intercept Pub/Sub messages to perform operations like pushing the events into a list.
Type of events
Keyspace notifications are implemented sending two distinct type of events for every operation affecting the Redis data space. For instance a DEL operation targeting the key named mykey in database 0 will trigger the delivering of two messages, exactly equivalent to the following two PUBLISH commands:
PUBLISH __keyspace@0__:mykey del
PUBLISH __keyevent@0__:del mykey
It is easy to see how one channel allows to listen to all the events targeting the key mykey and the other channel allows to obtain information about all the keys that are target of a del operation.
The first kind of event, with keyspace prefix in the channel is called a Key-space notification, while the second, with the keyevent prefix, is called a Key-event notification.
In the above example a del event was generated for the key mykey. What happens is that:
- The Key-space channel receives as message the name of the event.
- The Key-event channel receives as message the name of the key.
It is possible to enable only one kind of notification in order to deliver just the subset of events we are interested in.
Configuration
By default keyspace events notifications are disabled because while not very sensible the feature uses some CPU power. Notifications are enabled using the notify-keyspace-events of redis.conf or via the CONFIG SET.
Setting the parameter to the empty string disables notifications. In order to enable the feature a non-empty string is used, composed of multiple characters, where every character has a special meaning according to the following table:
K Keyspace events, published with __keyspace@<db>__ prefix.
E Keyevent events, published with __keyevent@<db>__ prefix.
g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...
$ String commands
l List commands
s Set commands
h Hash commands
z Sorted set commands
x Expired events (events generated every time a key expires)
e Evicted events (events generated when a key is evicted for maxmemory)
A Alias for g$lshzxe, so that the "AKE" string means all the events.
At least K or E should be present in the string, otherwise no event will be delivered regardless of the rest of the string.
For instance to enable just Key-space events for lists, the configuration parameter must be set to Kl, and so forth.
The string KEA can be used to enable every possible event.
Events generated by different commands
Different commands generate different kind of events according to the following list.
- DEL generates a
delevent for every deleted key. - RENAME generates two events, a
rename_fromevent for the source key, and arename_toevent for the destination key. - EXPIRE generates an
expireevent when an expire is set to the key, or aexpiredevent every time setting an expire results into the key being deleted (see EXPIRE documentation for more info). - SORT generates a
sortstoreevent whenSTOREis used to set a new key. If the resulting list is empty, and theSTOREoption is used, and there was already an existing key with that name, the result is that the key is deleted, so adelevent is generated in this condition. - SET and all its variants (SETEX, SETNX,GETSET) generate
setevents. However SETEX will also generate anexpireevents. - MSET generates a separated
setevent for every key. - SETRANGE generates a
setrangeevent. - INCR, DECR, INCRBY, DECRBY commands all generate
incrbyevents. - INCRBYFLOAT generates an
incrbyfloatevents. - APPEND generates an
appendevent. - LPUSH and LPUSHX generates a single
lpushevent, even in the variadic case. - RPUSH and RPUSHX generates a single
rpushevent, even in the variadic case. - RPOP generates an
rpopevent. Additionally adelevent is generated if the key is removed because the last element from the list was popped. - LPOP generates an
lpopevent. Additionally adelevent is generated if the key is removed because the last element from the list was popped. - LINSERT generates an
linsertevent. - LSET generates an
lsetevent. - LTRIM generates an
ltrimevent, and additionally adelevent if the resulting list is empty and the key is removed. - RPOPLPUSH and BRPOPLPUSH generate an
rpopevent and anlpushevent. In both cases the order is guaranteed (thelpushevent will always be delivered after therpopevent). Additionally adelevent will be generated if the resulting list is zero length and the key is removed. - HSET, HSETNX and HMSET all generate a single
hsetevent. - HINCRBY generates an
hincrbyevent. - HINCRBYFLOAT generates an
hincrbyfloatevent. - HDEL generates a single
hdelevent, and an additionaldelevent if the resulting hash is empty and the key is removed. - SADD generates a single
saddevent, even in the variadic case. - SREM generates a single
sremevent, and an additionaldelevent if the resulting set is empty and the key is removed. - SMOVE generates an
sremevent for the source key, and ansaddevent for the destination key. - SPOP generates an
spopevent, and an additionaldelevent if the resulting set is empty and the key is removed. - SINTERSTORE, SUNIONSTORE, SDIFFSTORE generate
sinterstore,sunionostore,sdiffstoreevents respectively. In the special case the resulting set is empty, and the key where the result is stored already exists, adelevent is generated since the key is removed. ZINCRgenerates azincrevent.- ZADD generates a single
zaddevent even when multiple elements are added. - ZREM generates a single
zremevent even when multiple elements are deleted. When the resulting sorted set is empty and the key is generated, an additionaldelevent is generated. ZREMBYSCOREgenerates a singlezrembyscoreevent. When the resulting sorted set is empty and the key is generated, an additionaldelevent is generated.ZREMBYRANKgenerates a singlezrembyrankevent. When the resulting sorted set is empty and the key is generated, an additionaldelevent is generated.- ZINTERSTORE and ZUNIONSTORE respectively generate
zinterstoreandzunionstoreevents. In the special case the resulting sorted set is empty, and the key where the result is stored already exists, adelevent is generated since the key is removed. - Every time a key with a time to live associated is removed from the data set because it expired, an
expiredevent is generated. - Every time a key is evicted from the data set in order to free memory as a result of the
maxmemorypolicy, anevictedevent is generated.
IMPORTANT all the commands generate events only if the target key is really modified. For instance an SREM deleting a non-existing element from a Set will not actually change the value of the key, so no event will be generated.
If in doubt about how events are generated for a given command, the simplest thing to do is to watch yourself:
$ redis-cli config set notify-keyspace-events KEA
$ redis-cli --csv psubscribe '__key*__:*'
Reading messages... (press Ctrl-C to quit)
"psubscribe","__key*__:*",1
At this point use redis-cli in another terminal to send commands to the Redis server and watch the events generated:
"pmessage","__key*__:*","__keyspace@0__:foo","set"
"pmessage","__key*__:*","__keyevent@0__:set","foo"
...
Timing of expired events
Keys with a time to live associated are expired by Redis in two ways:
- When the key is accessed by a command and is found to be expired.
- Via a background system that looks for expired keys in background, incrementally, in order to be able to also collect keys that are never accessed.
The expired events are generated when a key is accessed and is found to be expired by one of the above systems, as a result there are no guarantees that the Redis server will be able to generate the expired event at the time the key time to live reaches the value of zero.
If no command targets the key constantly, and there are many keys with a TTL associated, there can be a significant delay between the time the key time to live drops to zero, and the time the expired event is generated.
Basically expired events are generated when the Redis server deletes the key and not when the time to live theoretically reaches the value of zero.
This website is open source software. See all credits.

REDIS key notification的更多相关文章
- 利用Redis keyspace notification(键空间通知)实现过期提醒
一.序言: 本文所说的定时任务或者说计划任务并不是很多人想象中的那样,比如说每天凌晨三点自动运行起来跑一个脚本.这种都已经烂大街了,随便一个 Crontab 就能搞定了. 这里所说的定时任务可以说是计 ...
- 如何利用redis key过期事件实现过期提醒
https://blog.csdn.net/zhu_tianwei/article/details/80169900 redis自2.8.0之后版本提供Keyspace Notifications功能 ...
- 【Redis系列】Spring boot实现监听Redis key失效事件
talk is cheap, show me the code. 一.开启Redis key过期提醒 方式二:修改配置文件 redis.conf # 默认 notify-keyspace-events ...
- Redis Key 命令
Redis Key 命令 del key1 key2 - keyn 删除键为key1,key2-keyn,空格分隔. persist key 移除给定 key 的生存时间,将这个 key ...
- springboot redis key乱码
原写法: @Autowired private RedisTemplate redisTemplate; 写入redis后,查看key值 127.0.0.1:6379> keys * 1) &q ...
- redis key的过期时间
设置redis key的生存过期时间 Redis 有四个不同的命令可以用于设置键的生存时间(键可以存在多久)或过期时间(键什么时候会被删除) : EXPlRE 命令用于将键key 的生存时间设置为tt ...
- Spring boot实现监听Redis key失效事件实现和其它方式
需求: 处理订单过期自动取消,比如下单30分钟未支付自动更改订单状态 用户绑定隐私号码当订单结束取消绑定等 解决方案1: 可以利用redis自带的key自动过期机制,下单时将订单id写入redis,过 ...
- SpringBoot实现监听redis key失效事件
需求: 处理订单过期自动取消,比如下单30分钟未支付自动更改订单状态 解决方案1: 可以利用redis天然的key自动过期机制,下单时将订单id写入redis,过期时间30分钟,30分钟后检查订单状态 ...
- Redis Key操作
[Redis Key操作] 1.GETSET key value 将给定 key 的值设为 value ,并返回 key 的旧值(old value). 当 key 存在但不是字符串类型时,返回一个错 ...
随机推荐
- javascript 设计模式2----策略模式
1.定义:定义一系类的算法,把它们一个个封装起来,并且使它们可以相互替换 2.解释:就是把算法和一个规则单独分封,在使用时单独调用. 简单例子: var strategies = { "S& ...
- Android--菜单详解
Android中的菜单分为三种,即选项菜单(系统菜单),上下文菜单和弹出式菜单. 选项菜单: 一个activity只有一个选项菜单,选项菜单的创建方式有低版本创建和高版本创建两种.最常用的是干版本创建 ...
- [问题2014S12] 复旦高等代数II(13级)每周一题(第十二教学周)
[问题2014S12] 设 \(A,B\) 都是 \(n\) 阶半正定实对称阵, 证明: \(AB\) 的所有特征值都是非负实数. 进一步, 若 \(A,B\) 都是正定实对称阵, 证明: \(AB ...
- String,StringBuffer与StringBuilder的区别??[转]
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- 第十二天 jni 了解
1 .什么是jni java native interface 是一种协议. 用于java 和C 语言之间进行 通讯. 2. java 8中基本类型 . byte (1个字节) short ...
- JQuery对表格进行排序
添加相关jar <script type="text/javascript" src="jquery-1.1.3.pack.js"></scr ...
- MFC编程入门之十七(对话框:文件对话框)
上一讲介绍的是消息对话框,本节讲解文件对话框.文件对话框也是很常用的一类对话框. 文件对话框的分类 文件对话框分为打开文件对话框和保存文件对话框,相信大家在Windows系统中经常见到这两种文件对话框 ...
- git ignore 添加忽略文件不生效解决办法
在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件).这个文件每一行保存了一个匹配的规则例如: /targ ...
- request获取各种信息
private Map<String, String> getHeadersInfo(HttpServletRequest request) { Map<String, String ...
- 读javascript高级程序设计07-引用类型、Object、Array
一.引用类型 ECMAScript是支持面向对象的,可以通过引用类型描述一类对象所具有的属性和方法. 创建对象实例的方法时是用new 操作符加构造函数:var p=new Person(). 二.Ob ...