针对 Redis 过期数据实时监控与监听,用户应首选基于 Redis Keyspace Notifications 机制结合客户端监听器(如 Spring Data Redis 的 KeyExpirationEventMessageListener 或 Redisson 的 ExpiredObjectListener)的实现方案。在选择策略时,若业务对实时性要求高且数据量适中,建议开启 notify-keyspace-events 配置并使用监听器处理业务逻辑(如订单超时取消);若关注内存清理效率,应采用惰性删除与定期删除相结合的策略。对于集群环境,需确保所有节点配置一致。避免使用定时轮询数据库方案,以减少系统负载并提升响应速度,同时注意监听机制可能带来的性能损耗,需根据实际并发量评估。
用了这么久的 redis,第一次知道这个骚操作 - Redis 过期键监听实现方案 (粘贴即用)
1. Redis 过期监听是啥?简单来说,java 可以收到 redis 发过来的消息 (某个 key 已经过期了) 典型应用场景 订单超时自动取消:用户下单后 30 分钟不付款,订单自动取消 对象存储的 URL 续期:图片的外部 url 续期 定时任务触发:利用键过期作为简易的延迟队列 防止被缓存击穿:到期后业务逻辑判断是否要做其他处理 2. 核心代码实现 (粘贴即用) 下面是具体代码,很简单:2.1 Maven 依赖 (可以不使用 redisson,只用 RedisTemplate,只是代码复杂了一点)
Redis 键过期监听实战:如何用 KeyExpirationEventMessageListener 实现订单超时自动取消
在电商系统的日常运营中,订单超时未支付是一个高频且必须妥善处理的问题。想象一下,用户将心仪的商品加入购物车,下单后却因各种原因迟迟未完成支付。如果系统不进行干预,这些“僵尸”订单会长期占用宝贵的库存,导致其他活跃用户无法购买,直接影响销售转化和用户体验。传统的解决方案,比如依赖数据库定时任务轮询扫描,在高并发场景下往往显得笨重且低效,不仅给数据库带来额外压力,还可能因为扫描间隔导致处理延迟。这时,一个更优雅、更实时的方案就显得尤为重要。Redis,这个我们熟知的高性能键值存储,除了缓存,其内置的键过期事件通知机制,为解决这类问题提供了一种近乎完美的思路。我们可以将订单 ID 与一个具有明确生存时间的键关联,当这个键因过期而被 Redis 自动删除时,系统能够立刻感知并触发后续的业务逻辑,比如自动取消订单、释放库存。整个过程异步、高效,对主业务链路几乎零侵入。本文将深入探讨如何利用 SpringData Redis 提供的 KeyExpirationEventMessageListener,将这一精巧的技术方案落地到真实的电商业务中。我们会从原理剖析开始,一步步搭建监听环境,处理可能遇到的坑,并最终构建一个健壮、可扩展的订单超时自动取消服务。无论你是正在为系统寻找更优解法的后端工程师,还是对 Redis 高级特性感兴趣的开发者,相信都能从中获得实用的启发。1. 理解 Redis 键空间通知与 Spring 的封装 在直接动手写代码之前,花点时间理解背后的机制至关重要。这能帮助我们在遇到问题时快速定位,而不是停留在“魔法生效了”或“魔法失效了”的困惑中。1.1 Redis Keyspace Notifications 的核心机制 Redis 的键空间通知 (Keyspace Notifications) 本质上是一个发布/订阅 (Pub/Sub) 系统。当 Redis 中某个键因为特定命令 (如 SET、DEL) 或因其生存时间 (TTL) 到期而被移除时,Redis 可以向特定的频道发布一条消息。任何订阅了这些频道的客户端都能接收到消息。这里有两个关键概念需要厘清:__keyspace@
Redis Key 过期怎么自动处理?键失效策略怎么设置和监控,避免数据丢失?
1,设置过期时间 expire key time(s)--这是最常用的方式 setex(string key, int seconds, string value)--字符串独有的方式 注意 : 除了 string 独有设置过期时间方法,其他类型都需要依靠 expire 方法来设置时间 如果没有设置时间,那缓存就是永不过期 如果设置了过期时间,之后又想让缓存永不过期,使用 persist key 2,三种过期策略 定时删除 含义:在设置 key 的过期时间的同时,为该 key 创建一个定时器,让定时器在 key 的过期时间来临时,对 key 进行删除 优点:保证内存被尽快释放 缺点:若过期 key 很多,删除这些 key 会占用很多的 cpu 时间,在 cpu 时间紧张的情况下,cpu 不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些 key 定时器的创建耗时,若为每一个设置过期时间的 key 创建一个定时器 (将会有大量的定时器产生),性能影响严重 没人用 惰性删除 含义:key 过期的时候不删除,每次从 数据库 获取 key 的时候去检查是否过期,若过期,则删除,返回 null. 优点:删除操作只发生在从数据库取出 key 的时候发生,而且只删除当前 key,所以对 cpu 时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步 (如果此时还不删除的话,我们就会获取到了已经过期的 key 了) 缺点:若大量的 key 在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露 (无用的垃圾占用了大量的内存) 定期删除 含义:每隔一段时间执行一次删除过期 key 操作 优点:通过限制删除操作的时长和频率,来减少删除操作对 cpu 时间的占用--处理"定时删除"的缺点 定期删除过期 key--处理"惰性删除"的缺点 缺点 在内存友好方面,不如"定时删除" 在 cpu 时间友好方面,不如"惰性删除" 难点 合理设置删除操作的执行时长 (每次删除执行多长时间) 和执行频率 (每隔多长时间做一次删除)(这个要根据 服务器 运行情况来定了) 注意 : 上边所说的数据库指的是内存数据库,默认情况下每一台 (2026 年 3 月 31 日的资料)(撰于 2026 年 4 月 26 日)
通过 Redisson 监听 Redis 集群的 Key 过期事件的实现指南
在分布式系统中,监听 redis 键过期事件是实现缓存失效,订单超时取消等功能的常用方案。本文将详细介绍如何通过 redisson 高效监听 redis 集群的 key 过期事件,包含环境配置,代码实现及最佳实践,适用于生产环境落地。一,前置条件:开启 redis 集群的键过期通知 redis 默认关闭键事件通知,需在所有集群节点的配置文件 (redis.conf) 中开启过期事件监听,确保事件能被正确触发:1.修改配置文件 1 2 #开启键过期事件通知 (e 表示键事件,x 表示过期事件) notify-keyspace-events ex 配置说明:notify-keyspace-events 参数用于指定监听的事件类型,ex 组合表示仅监听键过期事件 (减少不必要的事件推送,提升性能). 2.生效配置 若 redis 已启动,可通过命令临时生效 (重启后失效): 1 2 #连接任意集群节点执行 redis-cli -h 192.168.1.1 -p 6379 config set notify-keyspace-events ex 生产环境建议修改配置文件后重启集群,确保配置持久化。二,引入 redisson 依赖 redisson 提供了对 redis 集群的原生支持,通过 spring boot starter 可快速集成:1 2 3 4 5 < dependency > < groupid >org.redisson groupid > < artifactid >redisson-spring-boot-starter artifactid > < version >3.52.0 version > dependency > 三,配置 redisson 连接 redis 集群 redisson 通过 config 类配置集群连接,需指定节点地址,认证信息及连接池参数,确保高可用:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 import org.redisson.redisson; import org.redisson.api.redissonclient; import org.redisson.config.config; import org.redisson.config.readmode; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; @configuration public class redissonclusterconfig { @bean (destroymethod = "shutdown(搜索结果收录于 2025 年 11 月 9 日)
FAQ
Redis 过期监听功能默认是开启的吗?
不是,键空间通知功能默认是关闭的,因为它会消耗少量额外的 CPU 资源,需要在配置文件中手动开启。
监听 Redis 过期事件会对性能产生多大影响?
监听机制会消耗少量额外的 CPU 资源,在高并发场景下需评估性能损耗,建议仅监听必要的事件类型以提升性能。
在 Redis 集群环境下如何配置过期监听?
需在所有集群节点的配置文件 (redis.conf) 中开启过期事件监听,确保事件能被正确触发,生产环境建议修改配置文件后重启集群。
Redis 过期删除策略主要有哪几种?
主要有定时删除、惰性删除和定期删除三种策略,各自在内存友好性和 CPU 时间友好性上有所不同,需根据场景选择。