Redis如何实现数据过期异步通知_配置notify-keyspace-events监控

雨磊同学_6778

雨磊同学_6778

2026-04-05

317人浏览

原创

redis默认关闭键空间事件,需显式配置notify-keyspace-events ex启用过期通知;客户端须订阅__keyevent@n__:expired频道,且仅主节点生成事件。

redis如何实现数据过期异步通知_配置notify-keyspace-events监控

Redis 的 notify-keyspace-events 默认是关闭的

Redis 启动时默认不发送任何键空间事件,哪怕你写了 EXPIRE 或 SET key val EX 60,过期也不会触发通知。这不是 bug,是设计选择——事件通知有开销,必须显式开启。

实操建议:

  • 在 redis.conf 中添加 notify-keyspace-events Ex(大小写敏感),E 表示启用键空间事件,x 表示监听过期事件
  • 如果用 redis-cli CONFIG SET notify-keyspace-events Ex 动态设置,重启后会丢失,务必同步写入配置文件
  • 别写成 notify-keyspace-events "Ex"(带引号)——Redis 会静默忽略,且不报错
  • 注意:该配置对所有数据库生效,不能只对 db0 开启而 db1 关闭

订阅 __keyevent@N__:expired 才能收到过期消息

开启配置后,Redis 并不会主动推送;客户端必须通过 PUBLISH/SUBSCRIBE 主动监听对应频道。频道名格式固定:__keyevent@<db_id>__:expired</db_id>,其中 <db_id></db_id> 是数据库编号(默认是 0)。

常见错误现象:

  • 订阅了 __keyevent@0__:del 却等 EXPIRE 通知——频道名不匹配,收不到
  • 用 redis-cli --csv SUBSCRIBE '__keyevent@0__:expired' 测试时,忘了加单引号,shell 把 @ 当作特殊字符处理,导致订阅失败
  • 应用连接的是 db2(SELECT 2),但监听的是 @0 频道——过期事件只发到实际发生操作的数据库频道

简单验证命令:

redis-cli SUBSCRIBE '__keyevent@0__:expired'

另起终端执行:

redis-cli SET testkey "val" EX 2

两秒后,第一个终端应输出类似:

1) "message"
2) "__keyevent@0__:expired"
3) "testkey"

EXPIRE 和 PEXPIRE 触发行为不一致

过期通知只在键真正被 Redis 主动删除那一刻发出,不是在 EXPIRE 命令返回时。这意味着:如果键已过期但尚未被惰性或定期删除机制清理,就不会发通知。

关键差异:

  • EXPIRE key 1 设置 1 秒后过期,但若期间没访问该 key,且 Redis 还没轮到它做定期清理(默认每 100ms 检查一次,每次最多检查 20 个 key),通知可能延迟数秒甚至更久
  • PEXPIRE key 100 也是同样逻辑,毫秒级精度不改变“触发时机取决于实际删除”这一本质
  • 使用 DEL 或 FLUSHDB 删除带过期时间的 key,**不会**触发 expired 事件——它走的是显式删除路径,发的是 del 事件

所以别指望靠这个做精确定时任务;它适合“某键大概率已失效,需要清理下游状态”的场景,比如 Session 过期后踢用户下线。

监听服务要防断连、重复、漏收

Redis 的 SUBSCRIBE 是无状态的:连接断开后,之前订阅的频道全部丢失,重连需重新 SUBSCRIBE;而且没有 ACK 机制,网络抖动可能导致消息丢失。

实操建议:

  • 不要用短连接反复订阅;保持长连接,并实现自动重连 + 重订阅逻辑
  • 收到 expired 消息后,立刻用 EXISTS key 确认键是否真的没了——防止收到旧消息或重复消息(比如主从切换时可能重发)
  • 避免在回调里做耗时操作(如调远程 HTTP 接口),否则阻塞订阅线程,后续事件积压
  • 如果业务要求强可靠性,得配合外部存储(如写入 Kafka / DB 记录过期事件)+ 幂等处理,Redis 自身不保证投递

最常被忽略的一点:从节点默认不产生键空间事件,即使开启了 notify-keyspace-events。只有写操作发生在主节点时,事件才由主节点发出。从节点只转发,不生成。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
kafka消费者组有什么作用
kafka消费者组有什么作用

kafka消费者组的作用:1、负载均衡;2、容错性;3、广播模式;4、灵活性;5、自动故障转移和领导者选举;6、动态扩展性;7、顺序保证;8、数据压缩;9、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.01.12

2506

5

kafka消费组的作用是什么
kafka消费组的作用是什么

kafka消费组的作用:1、负载均衡;2、容错性;3、灵活性;4、高可用性;5、扩展性;6、顺序保证;7、数据压缩;8、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

590

5

rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

564

5

Java 流式处理与 Apache Kafka 实战
Java 流式处理与 Apache Kafka 实战

本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。

2026.02.04

610

32

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

2023.10.17

580

4

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

2023.10.18

876

5

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

2025.08.19

1866

14

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3088

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

4589

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习