键空间通知的用法与限制
开启通知后,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 通道与订阅端都会被压垮,应按事件类别精确裁剪。