
🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
| 专栏名称 | 专栏介绍 |
| 本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 | |
| 本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! | |
| 全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 | |
| 本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 | |
| 本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 | |
| 本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录

。在分布式系统中,缓存是提升性能和保护数据库的利器,但也引入了缓存雪崩、击穿和穿透这些经典问题。理解它们的区别并掌握应对策略,对构建稳定可靠的服务至关重要。
下面这个表格能帮你快速抓住核心区别与应对要点。
| 问题类型 | 问题核心特征 | 核心解决方案概览 |
|---|---|---|
| 缓存雪崩 | 大量缓存键在同一时刻集中失效,或Redis缓存服务整体宕机,导致所有请求涌向数据库。 | 设置均匀过期时间、互斥锁、服务熔断/限流、构建高可用集群。 |
| 缓存击穿 | 某个访问极其频繁的热点数据键过期,瞬间有大量并发请求穿透缓存,直接访问这个数据。 | 热点数据永不过期、互斥锁/分布式锁、缓存预热。 |
| 缓存穿透 | 访问一个缓存和数据库中根本不存在的数据。恶意攻击者可能反复发起此类请求,导致数据库压力过大。 | 缓存空值或缺省值、使用布隆过滤器快速判断数据是否存在、请求参数校验。 |
🔎 深入理解与解决方案
缓存雪崩
缓存雪崩好比系统缓存层的整体“瘫痪”。
-
预防为主:给不同的缓存数据设置随机的过期时间,避免大量数据同时失效。例如,在基础过期时间上增加一个几分钟的随机值。
-
过程控制:当缓存失效,大量请求涌入时,使用互斥锁(Mutex Lock)控制,保证同一时间只有一个线程去重建缓存,其他线程等待或返回默认值。
-
灾后容错:如果Redis实例整个宕机,需启动服务熔断和限流机制。服务熔断是暂时停止应用对缓存服务的访问,直接返回友好提示,保护数据库。限流则是在入口层控制每秒进入系统的请求数,将多余请求直接拒绝。
-
架构高可用:通过Redis主从集群或哨兵模式搭建高可用缓存架构,当主节点宕机时,从节点可以切换为主节点继续提供服务。
缓存击穿
缓存击穿是“点”的问题,针对单个热点key。
-
永不失效:对于访问频率极高的热点数据(如明星八卦、重要商品信息),可以不设置过期时间,使其永驻缓存。同时,通过后台任务在数据变更时主动更新缓存。
-
加锁重建:如果热点数据确实需要过期,在缓存失效的瞬间,通过互斥锁或分布式锁,只允许一个线程去数据库查询并重建缓存,其他线程等待锁释放后直接读取新缓存。在分布式环境下,可使用Redis的
SET key value [EX seconds] NX命令或Redisson等工具实现分布式锁。 -
缓存预热:系统上线或活动开始前,提前将已知的热点数据加载到缓存中,避免高峰时段瞬间冲击。
缓存穿透
缓存穿透是查询了不存在的数据,每次都会绕过缓存访问数据库。
-
缓存空值:当数据库中查询不到数据时,也将这个空结果(或特定缺省值)进行缓存,并设置一个较短的过期时间(如几分钟)。后续相同的请求就能在缓存层被拦截。注意可能大量无效key会占用内存空间。
-
布隆过滤器:在缓存和数据库之间加一层布隆过滤器。它由一个很大的比特数组和多个哈希函数构成,可以高效地判断某个key是否绝对不存在于数据库中。
-
工作流程:写入数据时,将key通过多个哈希函数映射到比特数组的多个位置并置为1。查询时,如果key映射的所有位都是1,则key可能存在(有误判率);如果任何一个位为0,则key肯定不存在。
-
重要特性:布隆过滤器说“存在”不一定准,但说“不存在”一定准。正好用于拦截不存在数据的请求。对于数据频繁变化的场景,需要考虑使用支持删除的变种(如布谷鸟过滤器)或定期重建。
-
-
接口层校验:在API入口处对请求参数进行严格校验,如检查ID是否为正整数、字段格式是否合法等,将明显恶意的请求在最初阶段拦截掉。
💎 实战策略与总结
在实际项目中,通常需要根据具体业务场景组合使用这些方案。
-
策略组合:例如,针对热点数据,可以采用
布隆过滤器 +缓存空值 +互斥锁 的组合拳。先经布隆过滤器拦截绝对不存在的key,对可能存在的key查询缓存,若未命中则加锁,再查数据库,若数据库为空则缓存空值。 -
监控预警:建立完善的监控体系,密切关注缓存命中率、内存使用情况和数据库QPS等关键指标。当缓存命中率骤降或数据库QPS异常升高时,能快速定位问题。
-
选择权衡:选择方案时常需要考虑数据一致性、系统复杂度和维护成本。例如,使用布隆过滤器需容忍一定的误判率,而保证数据强一致性则可能增加系统复杂性和维护成本。
希望这份详细的梳理能帮助你更好地理解和应对缓存使用中的这些典型问题。如果你有更具体的业务场景,我们可以继续深入探讨。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

1169

被折叠的 条评论
为什么被折叠?



