讲师中心 微信公众号
AI工具推荐 视频效率加速

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

雨磊同学_6778

雨磊同学_6778

发布时间:2026-04-05 08:21:32

|

317人浏览过

|

来源于php中文网

原创

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。只有写操作发生在主节点时,事件才由主节点发出。从节点只转发,不生成。

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

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

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

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

2526

2024.01.12

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

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

590

2024.02.23

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

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

564

2024.02.23

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

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

610

2026.02.04

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

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

580

2023.10.17

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

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

876

2023.10.18

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

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

1866

2025.08.19

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

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

3108

2023.10.19

C++运算符基础入门
C++运算符基础入门

本专题详细讲解了C++运算符的类型、语法与使用方法,涵盖算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符及其他特殊运算符,并通过代码示例解析优先级与结合性。

0

2026.10.09

热门下载

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

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn