讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

updream

一键生成高质量推广成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

AniShort
AniShort

AI短剧协同制作平台

Redis怎样避免缓存击穿导致大量驱逐_结合布隆过滤器与合理的TTL设置预防垃圾数据写入

轻明同学_3372

轻明同学_3372

发布时间:2026-04-12 08:32:45

|

950人浏览过

|

来源于php中文网

原创

缓存击穿是热点key过期瞬间高并发查询导致DB压力飙升,需布隆过滤器前置拦截非法请求、空值缓存兜底短暂窗口、逻辑过期保障合法热点数据不被穿透,三者协同防御。

redis怎样避免缓存击穿导致大量驱逐_结合布隆过滤器与合理的ttl设置预防垃圾数据写入

缓存击穿的本质是热点 key 过期瞬间的并发穿透

不是所有“查不到缓存就打 DB”的情况都叫击穿——只有数据库里**确实存在该数据**,但 Redis 中的 key **恰好过期 + 高并发访问**,才构成击穿。此时大量线程同时发现缓存 miss,又几乎同时去查 DB、回写缓存,造成瞬时 DB 压力飙升。

单纯加锁或延长 TTL 只解决“并发重建”问题,但没拦住**本不该存在的 key 请求**(比如恶意 ID、已下架商品 ID)。这类请求哪怕加了互斥锁,也会反复触发无效 DB 查询 + 写空值,最终污染缓存、挤占内存。所以必须前置过滤 + 后置兜底协同防御。

布隆过滤器必须放在缓存读取之前,且只校验“一定不存在”的 key

布隆过滤器(Bloom Filter)不是万能钥匙,它只保证:如果 bloom.mightContain(key) 返回 false,那这个 key 在底层数据源中**绝对不存在**;若返回 true,只是“可能存在”,仍需走缓存 → DB 流程。

常见错误是把它当缓存用,或者在缓存 miss 后才查布隆——这就失去意义了。正确位置是:请求一进来,先过布隆:

  • 对所有查询入口(如 GET /product/{id}),解析出 id 后立即调用 bloom.mightContain("product:" + id)
  • 返回 false → 直接返回 404 或空对象,**不查 Redis、不查 DB、不写任何缓存**
  • 返回 true → 正常走 redis.get("product:" + id) 流程
  • 布隆本身要定期重建(如每天凌晨同步全量有效 ID),并支持热更新(如新增商品时实时 bloom.put())

空值缓存 TTL 必须短,且真实数据写入时要主动删除空值 key

即使有布隆过滤,仍可能漏掉刚新增但尚未同步进布隆的合法 key(如秒杀上架后几毫秒内请求),所以空值缓存仍是必要兜底。但它的 TTL 不能拍脑袋设 60 秒或 5 分钟——得看业务容忍脏读的窗口和 DB 压力曲线。

Sentinal Redis
Sentinal Redis

监控Redis服务器健康状况、内存、性能及BullMQ队列。检查队列深度、失败任务,分析慢查询并诊断问题。

下载

关键陷阱在于:很多人缓存空值后,等 DB 插入真实数据,却忘了删掉那个 "NULL" key,导致后续请求永远命中空值,变成“假击穿”:

  • 空值写入统一用 redis.setex(key, 60, "NULL")(TTL 60 秒是较安全起点,可按压测结果下调)
  • 任何写 DB 的路径(insert / update / restore),只要涉及该 key 对应实体,必须同步执行 redis.del(key)
  • 不要依赖“空值自然过期”,因为高并发下它可能被反复写入,实际存活远超预期

热点 key 永不过期 + 逻辑过期字段才是抗击穿的稳定组合

对真正高频访问的热点 key(如首页 banner、秒杀商品详情),靠布隆 + 空值缓存还不够——它们本就不该过期。但“永不过期”不等于“永不更新”,而是把过期判断从 Redis 层移到应用层:

示例结构:{"data": {...}, "expireAt": 1744256580}(Unix 时间戳)

  • 写入时:用 redis.set("product:1001", jsonStr),不带 TTL
  • 读取时:反序列化后检查 expireAt
  • 过期了?尝试 redis.setnx("mutex:product:1001", "1", 30) 获取锁,成功则异步刷新;失败则直接返回旧数据
  • 注意:Redis 内存淘汰策略必须设为 allkeys-lru 或 volatile-lru,否则永不过期 key 可能被误删

布隆过滤器防的是“非法请求”,逻辑过期保的是“合法热点”,空值缓存兜的是“短暂窗口期”。三者缺一不可,而最容易被忽略的,是布隆未覆盖的新数据上线间隙,以及空值 key 被遗忘清理。

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

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

WorkBuddy

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

DeepSeek

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

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

834

2025.10.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4738

2023.08.10

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

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

4889

2023.11.02

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

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

4455

2023.11.14

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

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

8592

2024.04.02

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

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

663

2024.04.07

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

40

2026.11.06

热门下载

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

精品课程

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

共0课时 | 0人学习

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

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