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

Redis缓存击穿解决方案的性能对比分析,哪种更优?

梦明大大_8766

梦明大大_8766

发布时间:2026-08-09 10:49:20

|

160人浏览过

|

来源于php中文网

原创

缓存击穿指单个热点key过期瞬间遭大量并发请求穿透至数据库,导致瞬时DB压力激增;核心解决思路是“续命”(如永不过期、自动续期)或“防并发重建”(如原子化SET+EX、互斥锁),布隆过滤器对此无效。

redis缓存击穿解决方案的性能对比分析,哪种更优?

缓存击穿(Cache Breakdown)指某个热点 key 在过期瞬间被大量并发请求穿透到数据库,造成 DB 瞬时压力激增。它和缓存穿透、雪崩不同,**只针对单个高热度 key 的过期场景**。解决它的核心思路不是“挡流量”,而是“续命”或“防并发重建”。没有绝对“更优”的方案,只有在具体场景下更稳、更轻、更易维护的选型。

用 SETNX + 过期时间实现互斥重建,为什么容易漏掉 EXPIRE?

这是最常被抄错的写法:先 SETNX lock:hotkey 1,成功再查 DB、写缓存、删锁。但很多人忘了给缓存本身设过期时间,导致后续所有请求都走 DB —— 因为缓存没写进去,或者写进去了但没 EX 参数。

正确做法必须两步原子化(或至少强顺序):

  • SET hotkey value EX 300 NX —— 直接带过期时间的原子写入,避免写完不设过期
  • 若失败,才去争锁:SETNX lock:hotkey 1,成功后加 EXPIRE lock:hotkey 10 防死锁,再查 DB、SET hotkey value EX 300、DEL lock:hotkey
  • 客户端需统一处理 nil 响应:不直接报错,而是降级查 DB 或返回默认值

Redis 2.6+ 的 EVAL 脚本能否真正解决并发重建?

可以,但代价是 Lua 脚本阻塞主线程 —— 所有其他命令(包括 GET、INCR)都会排队等它执行完。对单个热点 key 来说,脚本内逻辑越重(比如含 HTTP 请求或复杂计算),阻塞越久,QPS 下跌越明显。

典型误用:

redis.call("GET", KEYS[1])
if not res then
  local data = http.get(...) -- ❌ 不允许!Redis Lua 不支持网络 IO
  redis.call("SET", KEYS[1], data, "EX", 300)
end

可行的轻量脚本只做“判断 + 写缓存”,DB 查询必须由客户端完成:

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • 脚本只检查 key 是否存在,不存在则 SET ... NX EX 占位,并返回 1;存在则返回 0
  • 客户端收到 1 后去查 DB,再 SET 真实值;收到 0 则直接 GET
  • 注意:脚本不能依赖 redis.call("TTL", ...) 判断是否“即将过期”,因为 TTL 返回 -2/-1 时语义模糊,不如业务层控制过期前 10 秒主动刷新

布隆过滤器(Bloom Filter)对缓存击穿完全无效,别乱套用

布隆过滤器解决的是**缓存穿透**(查一个压根不存在的 key),它能快速告诉你“这个 key 绝对不存在”,从而避免查 DB。但缓存击穿的前提是 key 存在且热度极高 —— 它只是刚好过期了。此时布隆过滤器永远返回 true,起不到任何拦截或分流作用。

如果你在击穿场景里加了布隆过滤器,只会徒增一次 Redis GETBIT 调用,还可能因 filter 误判(false positive)导致合法请求被拒。

真正该用布隆过滤器的地方只有两个:

  • 用户输入的 ID 是纯数字但长度不定(如短链 ID),且存在大量恶意构造的非法 ID
  • 黑名单/白名单类场景,需要极低内存开销判断海量元素是否“可能在集合中”

本地缓存(Caffeine/Guava)+ Redis 双检,为什么反而增加复杂度?

双检(先查本地缓存,再查 Redis,再查 DB)看似保险,但在击穿场景下问题突出:

  • 本地缓存过期时间难设定:设太短,频繁穿透;设太长,无法响应 Redis 中 key 的真实过期变化
  • 多实例部署时,各节点本地缓存不同步,A 节点刚重建好 hotkey,B 节点仍认为过期,又触发一次 DB 查询
  • 本地缓存失效策略(如 LRU)可能把 hotkey 淘汰掉,而 Redis 还没过期,造成“伪击穿”

除非你的服务是单实例、且 hotkey 更新频率极低(如每天一次)、且能接受秒级不一致,否则不建议引入本地缓存对抗击穿。

真正关键的细节常被忽略:**击穿防护的有效性,取决于你如何定义“热点 key 的生命周期”**。如果业务上允许该 key 提前 5 秒自动续期(比如用 EXPIRE hotkey 300 在每次访问时刷新),那比任何锁或脚本都简单可靠;但如果 key 必须严格按业务时间过期(如支付订单 15 分钟未支付自动关闭),那就必须接受重建瞬间的 DB 压力,并靠限流 + 降级兜底 —— 此时所谓“最优方案”其实是“最可控的兜底方案”。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

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

热门AI工具

更多
PixPix
PixPix Hot

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

豆包大模型

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

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

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

Atoms
Atoms Hot

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

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

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

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4509

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4055

2023.11.14

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

7532

2024.04.02

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

643

2024.04.07

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

756

2024.04.07

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

7422

2024.04.07

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1160

2024.04.07

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1096

2024.04.07

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

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

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