Redis 键空间消息提醒功能

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 从 Redis 2.8.0 开始,Redis 加入了 发布/订阅模式 以及**键空间消息提醒**(keyspace notification)功能。通过键空间消息提醒功能允许客户端通过订阅指定信道获取 Redis 数据变化的能力。由此 你会想到什么?如果 某个Redis实例没有不支持 psync 功能,则可以通过 **键空间消息提醒** 来获取Redis数据的变化,以此获取增量数据。-- **敲

从 Redis 2.8.0 开始,Redis 加入了 发布/订阅模式 以及键空间消息提醒(keyspace notification)功能。通过键空间消息提醒功能允许客户端通过订阅指定信道获取 Redis 数据变化的能力。由此 你会想到什么?
如果 某个Redis实例没有不支持 psync 功能,则可以通过 键空间消息提醒 来获取Redis数据的变化,以此获取增量数据。-- 敲黑板,这里是 数据迁移工具的 基础原理

注意,键空间消息提醒并不可靠,它不会对订阅端是否接收到消息进行确认。如果某个订阅的客户端断开重连,在此期间发生的数据变更事件将无法再次获得,一直向前增量。

一 配置

默认 Redis 并未开启键空间消息提醒功能, 通过设置 notify-keyspace-events 参数的值进行开启,例如:

redis> CONFIG GET notify-keyspace-events
1) "notify-keyspace-events"
2) ""
redis> CONFIG SET notify-keyspace-events KEA
OK
redis> CONFIG GET notify-keyspace-events
1) "notify-keyspace-events"
2) "AKE"

在上述示例中将 notify-keyspace-events 配置为 KEA,代表除未命中外的所有事件。其中,K与E代表事件的两种类型——Keyspace与Keyevent。

Keyspace代表与事件名称相关的消息,例如订阅对指定键进行的操作事件;

Keyevent代表与键名称相关的消息,例如订阅发生键过期事件的相关键名称。

关于更多的notify-keyspace-events配置,可参考下面的描述:

K:Keyspace事件,将会以__keyspace@<db>__作为事件的前缀
E:Keyevent事件,将会以__keyevent@<db>__作为事件的前缀
g:非特定类型的通用命令,例如DEL、EXPIRE、RENAME等
$:字符串命令,例如SET、INCR等
l:列表命令,例如LPUSH、LPOP等
s:集合命令,例如SADD、SREM等
h:哈希表命令,例如HSET、HINCRBY等
z:有序集合命令,例如ZSET、ZREM等
t:流命令,例如XADD、XDEL等
x:过期事件(在每个发生键过期的时侯产生)
e:淘汰事件(在每个发生键被淘汰的时候产生)
m:未命中事件(在访问某个不存在的键使产生)
A:配置g$lshztxe的别名,但不包括未命中事件 m

二 订阅指定事件

订阅的信道的格式为 __@__: 三个属性分别为:

tpye 事件类型(keyspace或keyevent)
db 数据库(例如数据库0)
event 事件(例如expired)

在完成配置后,可通过 SUBSCRIBE 命令订阅指定信道实现对一个或多个指定事件的订阅。例如通过订阅__keyevent@0__:expired 实现订阅数据库0中的键过期事件。

另外,也可以通过PSUBSCRIBE命令订阅一个或多个复合正则表达式匹配的信道。例如通过订阅**__key*@*__:** 订阅Redis中所有数据库中的所有事件。

三 命令事件

以下为常见的 Redis 命令对应的事件列表:

SET以及同类的SETEX、SETNX、GETSET:产生set事件,若使用SETEX则也会产生expire事件
MSET:将会为每个键都产生一个set事件
DEL:在某个键被删除时产生 del 事件
EXPIRE、PEXPIRE、EXPIREAT以及PEXPIREAT:当设置过期时间或未来时间的时间戳,则产生expire事件,否则产生del事件(将立即被删除)
LPUSH、LPUSHX与RPUSH、RPUSHX:根据插入的方向分别产生lpush或rpush事件
RPOP、LPOP:分别产生rpop与lpop事件,若移出的是列表中的最后一个元素,将会同时产生del事件
LSET:产生lset事件
LREM:产生lrem事件,同样若移除的元素为列表中的最后一个元素时将同时产生del事件
HSET、HSETNX以及HMSET:产生一个hset事件
HDEL:产生一个hdel事件,且在移除后哈希表为空的情况下产生del事件
SADD:产生一个sadd事件
SREM:产生一个srem事件,且在移除后集合为空的情况下产生del事件
SMOVE:原键中产生srem事件且在目标键中产生sadd事件
SINTERSTORE、SUNIONSTORE、SDIFFSTORE:分别产生sinterstore、sunionstore以及sdiffstore事件,且在结果为空集且目标键存在的情况下,将会产生del事件
ZADD:无论添加几个元素都只产生一个zadd事件
ZREM:无论移除几个元素都只产生一个zrem事件,当移除后有序集合为空时产生del事件
XADD:产生xadd事件,若使用MAXLEN子命令可能会同时产生xtrim事件
XDEL:产生xdel事件
PERSIST:如果对应的键所关联的过期事件成功被移除,则产生persist事件
在键发生过期时产生expired事件
在达到 maxmemory 设定的内存阈值后发生键淘汰时产生 evicted 事件

四 实践示例

订阅键过期事件

#### 会话一
redis1> SUBSCRIBE __keyevent@0__:expired
1) "subscribe"
2) "__keyevent@0__:expired"
3) (integer) 1
#### 会话二
# redis2> SETEX greeting 1 "hello world"
# 等待1秒后:
1) "message"
2) "__keyevent@0__:expired"
3) "greeting"

订阅所有事件

redis1> PSUBSCRIBE __key*@*__:*
1) "psubscribe"
2) "__key*@*__:*"
3) (integer) 1
# redis2> SET greeting "hello redis"
1) "pmessage"
2) "__key*@*__:*"
3) "__keyspace@0__:greeting"
4) "set"
1) "pmessage"
2) "__key*@*__:*"
3) "__keyevent@0__:set"
4) "greeting"

五 参考资料

https://redis.io/docs/manual/keyspace-notifications/

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
200 0
|
3月前
|
缓存 NoSQL Java
在 Spring Boot 应用中使用 Spring Cache 和 Redis 实现数据查询的缓存功能
在 Spring Boot 应用中使用 Spring Cache 和 Redis 实现数据查询的缓存功能
158 0
|
26天前
|
缓存 NoSQL 测试技术
【Azure Redis 缓存】Azure Redis 功能性讨论三: 调优参数配置
【Azure Redis 缓存】Azure Redis 功能性讨论三: 调优参数配置
|
27天前
|
存储 缓存 监控
【Azure Redis 缓存】Azure Redis 功能性讨论二
【Azure Redis 缓存】Azure Redis 功能性讨论二
【Azure Redis 缓存】Azure Redis 功能性讨论二
|
28天前
|
存储 缓存 NoSQL
【Azure Redis 缓存】Azure Redis功能性讨论
【Azure Redis 缓存】Azure Redis功能性讨论
|
1月前
|
NoSQL JavaScript Java
SpringBoot+Vue+Redis实现验证码功能、一个小时只允许发三次验证码。一次验证码有效期二分钟。SpringBoot整合Redis
这篇文章介绍了如何使用SpringBoot结合Vue和Redis实现验证码功能,包括验证码的有效期控制和一小时内发送次数的限制。
|
2月前
|
存储 NoSQL Java
Java中使用redis的bitMap实现签到功能
这个实现示例提供了一种灵活、高效的方式,展示了如何使用Redis来解决现实中的问题。
115 2
|
1月前
|
存储 NoSQL Java
基于SpringBoot+Redis实现查找附近用户的功能
使用Redis的GEO命令结合SpringBoot实现查找附近用户的功能,通过`GEOADD`命令添加地理位置信息和`GEORADIUS`命令查询附近用户。
50 0
|
1月前
|
存储 NoSQL Redis
基于SpringBoot+Redis实现点赞/排行榜功能,可同理实现收藏/关注功能,可拓展实现共同好友/共同关注/关注推送功能
在SpringBoot项目中使用Redis的Set和ZSet集合实现点赞和排行榜功能,并通过示例代码展示了如何使用`stringRedisTemplate`操作Redis来完成这些功能。
123 0
|
2月前
|
监控 NoSQL Redis
Redis性能优化问题之配置 Redis 的自动碎片整理功能,如何解决
Redis性能优化问题之配置 Redis 的自动碎片整理功能,如何解决