1. 两类通知通道
通道 | 含义 | 消息载荷 |
---|---|---|
__keyspace@<db>__:<key> | 键空间通知 | 事件名称,如 del |
__keyevent@<db>__:<event> | 键事件通知 | 具体键名,如 mykey |
可独立开启 K(Keyspace)或 E(Keyevent)前缀以精简流量。
2. 配置开关
# redis.conf 或命令行
CONFIG SET notify-keyspace-events "KEA" # 常用:所有事件
CONFIG SET notify-keyspace-events "Kxg" # 仅键空间 + 过期 + 通用写
- 空字符串关闭;
- 至少包含 K 或 E,否则实际不生效;
A
= 全部写操作别名(g$lshztxed
);m
(miss)、n
(new) 需显式添加。
3. 事件映射速查
DEL mykey
→del
EXPIRE mykey 10
→expire
- 键过期主动删除 →
expired
- 内存淘汰 →
evicted
- 新键写入 →
new
所有命令仅在键实际变更时产生事件。
4. 监听示例
# 启用通知
redis-cli config set notify-keyspace-events KEA
# 终端 A:订阅全部
redis-cli --csv psubscribe '__key*__:*'
# 终端 B:测试
redis-cli set foo bar
redis-cli del foo
输出顺序保证:如 RPOPLPUSH
先 rpop
再 lpush
。
5. 过期事件时序
过期事件在 删除时 触发,而非 TTL=0 的瞬间。若键长期未被访问,实际触发可能延迟;后台过期线程同样异步删除。
6. 集群注意事项
通知仅在持有目标分片的节点产生,不会广播。想监听全局事件需对每个节点建立订阅连接。
7. 最佳实践
- 按需开启,避免
"KEA"
带来的高频流量与 CPU 消耗; - 业务只需 DEL/EXPIRE,可用
"Kx"
; - 使用模式订阅结合前缀过滤减少客户端解析压力;
- 消费端应异步处理,防止阻塞 Pub/Sub 读循环;
- 生产环境监控
notify-keyspace-events
配置变更,防止误关停导致监听失效。
通过合理使用键空间事件通知,可轻松实现本地缓存失效、数据链路审计与实时指标上报等场景,提升系统一致性与可观测性。