当前位置:首页 > 文章列表 > 数据库 > Redis > Redis 过期事件监听实践:用 Keyspace Notifications 做轻量补偿

Redis 过期事件监听实践:用 Keyspace Notifications 做轻量补偿

来源:17golang原创 2026-06-29 12:07:25 0浏览 收藏

Redis 的过期 Key 常被当作“自然清理”机制使用:会话 30 分钟失效、验证码 5 分钟失效、临时任务状态 10 分钟失效。问题是,很多业务不只想让 Key 消失,还希望 Key 过期时顺手做一点补偿动作,比如标记会话超时、写一条业务日志、触发轻量清理。

Redis Keyspace Notifications 可以把 Key 变化通过 Pub/Sub 发出来。本文用“监听过期 Key 做轻量补偿”这个场景,讲清楚它能做什么、怎么快速试用、和定时扫描有什么区别,以及为什么不能把它当成可靠任务队列。

目录

  • 消息是什么:过期事件进入 Pub/Sub
  • 适用场景:只适合轻量提醒和辅助补偿
  • 快速试用:开启过期事件并订阅频道
  • 和旧方案对比:事件通知与定时扫描怎么配合
  • 采用风险:事件通知不能当可靠队列
  • 落地检查:上线前确认配置、兜底和指标

消息是什么:过期事件进入 Pub/Sub

Keyspace Notifications 的工作方式可以理解为:Redis 内部发生某类 Key 事件后,把事件发布到特定 Pub/Sub 频道。对过期事件来说,常见频道是 __keyevent@0__:expired,其中 0 表示数据库编号。

默认情况下,这类通知是关闭的。要监听过期事件,需要配置 notify-keyspace-events,例如只关注 keyevent 的 expired 事件,可以使用 Ex

Redis 过期事件从写入 TTL、过期事件、事件通道、监听服务到补偿动作的分层链路
过期事件监听的核心链路是:写入带 TTL 的 Key,Redis 发布过期事件,监听服务消费事件后做轻量补偿。
redis-cli CONFIG SET notify-keyspace-events Ex
redis-cli --csv PSUBSCRIBE '__keyevent@0__:expired'

另开一个终端写入带过期时间的 Key:

redis-cli SET session:1001 ok EX 30

等待 Key 过期后,订阅端会收到类似 session:1001 的消息。注意,消息体通常是 Key 名,不包含完整 value;如果补偿动作需要业务详情,应该提前把必要信息写到数据库或另一份可查询记录中。

适用场景:只适合轻量提醒和辅助补偿

这个能力适合“收到提醒后做一点补充动作”的场景,不适合承载必须成功的核心流程。

场景 适合程度 建议做法
临时会话过期后写审计日志 适合 监听过期事件,异步标记超时
验证码过期后清理辅助状态 适合 事件提醒加低频补扫
订单超时自动取消 谨慎 应以数据库状态和定时补偿为准
支付、库存扣减等强一致动作 不建议 使用可靠队列、数据库事务或专门调度系统

判断标准很简单:如果漏掉一个事件只会让补偿稍晚发生,可以考虑;如果漏掉一个事件会导致资金、库存、订单状态错误,就不要只依赖它。

快速试用:开启过期事件并订阅频道

先在测试环境确认配置和订阅链路。生产环境启用前,要评估事件量和监听服务稳定性。

1. 查看当前配置

redis-cli CONFIG GET notify-keyspace-events

如果返回空字符串,说明通知没有开启。

2. 开启过期事件

redis-cli CONFIG SET notify-keyspace-events Ex

E 表示 keyevent 类型通知,x 表示 expired 事件。这里只开启最小范围,避免把无关写入、删除、修改事件全部发布出来。

3. 订阅过期事件频道

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

4. 写入测试 Key

redis-cli SET timeout:order:1001 pending EX 5

订阅端收到 timeout:order:1001 后,就可以由监听服务解析业务类型和编号,做轻量补偿,例如写日志、更新一条状态记录或打指标。

和旧方案对比:事件通知与定时扫描怎么配合

很多团队原来会用定时任务扫描超时数据。扫描的优点是可重复、可兜底;缺点是延迟取决于周期,且扫描范围大时会增加系统压力。Keyspace Notifications 的优点是接近实时;缺点是 Pub/Sub 通知不保存离线消息。

方案 优点 风险 推荐位置
只用事件通知 响应快,代码链路短 监听端离线时可能漏消息 轻量提醒
只用定时扫描 可重复检查 有周期延迟,扫描成本较高 状态最终修正
事件通知 + 低频补扫 实时性和可靠性更均衡 实现略复杂 推荐组合

更稳的组合是:事件通知负责快速触发,低频扫描负责补漏,指标负责确认。例如监听服务收到 timeout:order:1001 后立即处理;每 5 分钟再扫描数据库里仍处于 pending 且已经超时的订单,补齐漏掉的动作。

采用风险:事件通知不能当可靠队列

Redis 官方文档明确说明,这类通知基于 Pub/Sub。Pub/Sub 的特点是实时发布,但不会为离线订阅者保留消息。也就是说,监听服务重启或网络短暂断开时,这段时间发布的事件可能收不到。

Redis 事件通知的采用风险:默认关闭、可能丢失、不精确,需要补扫兜底和指标确认
把事件通知当提醒,把补扫和指标当兜底,才是更可靠的过期事件处理闭环。

还有一个容易误解的点:过期事件不等于“TTL 到 0 的那一毫秒立刻通知”。Redis 过期删除既有访问时惰性删除,也有后台周期清理,因此事件到达时间可能有轻微延迟。对秒级精度要求很高的任务,应使用专门的延迟队列或调度系统。

落地检查:上线前确认配置、兜底和指标

上线前建议按这份清单检查:

  • 只开启需要的事件类型,例如过期事件使用 Ex,不要一口气打开全部通知。
  • 监听服务能自动重连,并在重连后继续订阅目标频道。
  • 事件处理逻辑是幂等的,同一个 Key 被重复处理也不会产生脏数据。
  • 核心业务状态以数据库或可靠存储为准,事件通知只做提醒和辅助补偿。
  • 有低频补扫任务,能发现监听服务离线期间漏掉的超时数据。
  • 记录 expired_events_total、处理成功数、处理失败数和补扫命中数。

总结一下,Redis Keyspace Notifications 很适合做“轻量、接近实时、可补偿”的过期事件提醒。它的正确位置不是替代任务队列,而是和定时补扫、数据库状态、指标告警一起组成处理闭环。只要边界定清楚,就能在不引入复杂调度系统的情况下,解决一批临时状态过期后的辅助处理问题。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go slog 结构化日志实践:从请求字段到检索定位Go slog 结构化日志实践:从请求字段到检索定位
上一篇
Go slog 结构化日志实践:从请求字段到检索定位
Chrome DevTools 导出 HAR 文件:从 Network 捕获到脱敏核对
下一篇
Chrome DevTools 导出 HAR 文件:从 Network 捕获到脱敏核对
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ljg-skills -
    ljg-skills
    ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
    2770次使用
  • MELO音乐 - AI 音乐生成平台,支持多模态创作能力
    MELO音乐
    MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
    2564次使用
  • UniScribe - AI 免费在线音视频转文字平台
    UniScribe
    UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
    2509次使用
  • 剧云 - 免费 AI 智能中文剧本创作平台
    剧云
    剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
    2740次使用
  • 万象有声 - AI 一站式有声内容创作平台
    万象有声
    万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
    2688次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码