首页/数据/数据库速查/键空间通知(keyspace notifications)
Redis 运维与场景124 条

键空间通知(keyspace notifications)

订阅键事件(set/del/expired 等):需开启 notify-keyspace-events 掩码;可用于缓存失效、统计、轻量调度,但事件不保证不丢。

数据库速查数据更新于 2026-10-13

键空间通知的用法与限制

开启通知后,Redis 会把键上发生的事件发布到 Pub/Sub 频道:一种频道带键名(keyspace),一种频道带事件名(keyevent)。业务可以订阅这些事件实现缓存失效、轻量统计或延迟任务。但事件本身不做持久化和重试,订阅端断线期间的事件全部丢失,因此它只能作为加速手段,不能作为唯一的数据来源。

基本信息

适用平台Redis 2.8.0+
开启参数notify-keyspace-events(掩码,需同时包含 K 或 E)
频道命名__keyspace@<db>__:<key> 与 __keyevent@<db>__:<event>
常见事件set、del、expired、incrby、lpush、expire
生效范围仅当前库;集群模式下各节点各自发布

典型使用场景

  • 本地缓存失效:数据变更时广播通知各节点清理进程内缓存
  • 会话到期处理:订阅 expired 事件做后续清理
  • 轻量统计:记录某类键的写入频次用于观察
  • 延迟任务:利用过期事件触发提醒类逻辑
  • 调试观察:临时开启事件流,确认某类操作是否真的发生

开启与订阅

开启与订阅
# 开启全部事件类别(A 是 g$lshzxet 的别名,按需裁剪)
CONFIG SET notify-keyspace-events KEA
# 只关注过期事件与字符串命令
CONFIG SET notify-keyspace-events KEx$
# 订阅键空间频道(按键名过滤)
redis-cli PSUBSCRIBE '__keyspace@0__:session:*'
# 订阅键事件频道(按事件类型过滤)
redis-cli PSUBSCRIBE '__keyevent@0__:expired'
# 把配置写入文件,避免重启后失效
CONFIG REWRITE

掩码字母含义

字母含义示例
K开启 keyspace 频道__keyspace@0__:mykey
E开启 keyevent 频道__keyevent@0__:del
g通用命令事件del、expire、rename
$字符串命令事件set、incrby
l / s / h / z列表、集合、哈希、有序集合事件lpush、sadd、hset、zadd
x / e过期事件与淘汰事件expired、evicted
A等价于 g$lshzxet 的别名常用的一键开启方式
过期事件在键被删除时发布,触发时机并不精确:它由后台过期策略决定,可能延迟数秒甚至更久,依赖它做定时任务的系统必须具备幂等与补偿能力。
生产环境直接全开 KEA:事件量可能非常大,Pub/Sub 通道与订阅端都会被压垮,应按事件类别精确裁剪。

易错点

  • 把通知当可靠消息通道:事件不持久化,订阅端断线期间全部丢失,必须有兜底机制
  • 生产全开 KEA:事件洪流拖慢 Redis 与订阅端,典型的高代价误配置
  • 依赖 expired 事件做精确调度:过期删除并不保证在到期瞬间发生,存在可观测的延迟
  • 集群环境下只订阅一个节点:事件分散在各节点发布,订阅单点会漏掉大部分通知

数据来源与参考

  • Redis 官方文档: 键空间通知
  • Redis 官方文档: notify-keyspace-events

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌