Redis热点Key过期咋办,聊聊那些处理和解决的小思路
- 问答
- 2026-01-24 04:13:06
- 1
关于Redis热点Key过期的问题,其实是一个挺经典又让人有点头疼的场景,咱们就聊聊这事儿,不想讲得太复杂,就用大白话来说说它是怎么回事,以及能怎么应付。
啥是“热点Key过期”问题?

想象一下,你有一个Key,比如叫“双十一秒杀商品库存_1001”,这个Key的值就是剩下的库存数量,它就是个“热点”,因为每秒有几十万次请求来查询它还有没有货,或者抢购时扣减库存,为了不让数据一直留着,你给这个Key设置了一个过期时间,比如活动结束后一小时自动删除。
问题就出在“过期”这个动作上,Redis清理过期Key主要有两种方式:一种是惰性删除,就是当某个客户端来读这个Key时,Redis才发现“哎呦,这Key过期了”,然后把它删掉,再告诉客户端这个Key不存在;另一种是定期删除,Redis会每隔一段时间随机抽查一些Key,把过期的清理掉。

如果这个热点Key恰好是在它非常“热”、被高频访问的时候过期,麻烦就来了,在它过期的那一刹那(可能只是毫秒级的时间窗口),第一个请求过来,Redis触发惰性删除,把这个Key删掉了,但就在这个极短的空隙里,后续海量的请求同时涌进来,它们都试图来读这个Key,Redis发现Key已经不存在了,因为第一个请求已经把它删了,这下好了,这海量请求全部“穿透”了Redis缓存,直接打到了后端的数据库上,数据库本来在高并发下就压力山大,突然又来这么一波巨大的流量冲击,很可能直接就扛不住,响应变慢甚至挂掉,这就是典型的热点Key过期引发的“缓存穿透”风暴。
有啥小思路可以处理和解决呢?

别让热点Key突然过期——随机续期大法。 这是比较常用也简单的一招,既然问题出在“同时过期”上,那我们就避免它,不要给热点Key设置一个固定的、精确的过期时间。 Instead,我们可以给Key设置一个比较长的过期时间,比如24小时,在每次读取这个Key的时候,偷偷干一件事:用一个随机数(比如在基础值上加减一个随机范围),给这个Key的过期时间再延长一些,这样,每个请求触发的续期时间点就错开了,避免了大量Key在同一时刻集体失效,即使这个Key最终不再被访问,它也会在24小时后由Redis的定期清理机制慢慢淘汰掉,不会对数据库造成冲击,这个思路在《Redis实战》这本书里也有类似的提及,核心思想就是分散过期压力。
采用“逻辑过期”代替“物理过期”。
这个思路有点“作弊”的意思,我们不依赖Redis自身的过期删除功能了,我们把这个Key的过期时间,作为一个字段和实际的数据一起存到Value里,Value存成一个JSON对象:{“data”: 真实数据, “expire_time”: 1735689600},每次读取这个Key时,程序先取出整个Value,然后检查一下当前的系统时间是否超过了expire_time,如果没超过,直接返回data;如果超过了,就说明数据“逻辑上”过期了,这时候,程序不是直接返回空,而是先去尝试从数据库加载最新数据,更新到Redis里,并设置一个新的逻辑过期时间,然后再返回新数据,这样做的好处是,即使数据过期,Redis里始终有这个Key存在,不会发生缓存穿透,顶多是第一个发现过期的请求会去查数据库并更新缓存,后续请求还能读到旧的(可能稍微过时一点点的)数据,或者等待第一个请求更新完,这比直接把数据库打垮要好得多,这种方案在一些互联网大厂的技术博客里经常能看到,是一种用空间和逻辑换稳定性的策略。
提前预热,错峰加载。 如果热点Key的过期时间是已知的(比如一场直播活动晚上10点结束,Key设了1小时后过期),那么我们可以提前做准备,在Key即将过期之前(比如提前5分钟),通过一个后台任务,主动去数据库查询最新数据,并重新塞回Redis,设置一个新的、较长的过期时间,这样,当真正的过期时刻来临时,新的数据已经安静地躺在Redis里了,用户无感知,数据库无压力,这要求我们对业务的高峰期和关键时间点有比较清晰的预判。
使用多级缓存兜底。 对于极其重要的热点数据,光靠Redis一层缓存可能还不够保险,可以在应用服务器本地(比如JVM内存中)再加一层本地缓存(如Caffeine、Guava Cache),当Redis的热点Key过期时,请求会先打到应用服务器,应用服务器可以先看看自己本地有没有缓存着这个数据,如果有(哪怕数据稍微旧一点),就先返回,同时异步地去触发Redis和本地缓存的更新,这样,数据库的压力就被应用服务器集群给分散和缓冲了,避免了单点被打爆的风险,这种多级缓存架构是应对超高并发场景的常见手段。
处理Redis热点Key过期,核心思想就几个:分散(让过期时间点错开)、缓冲(不让缓存瞬间消失)、预判(提前做好准备),没有一种方法是万能的,最好是根据自己业务的实际场景,灵活组合使用这些思路,对一般热点可以用随机续期,对核心热点可以用逻辑过期加多级缓存,这样才能最大程度地保证系统的平稳运行。
本文由革姣丽于2026-01-24发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/84865.html
