# 《高性能Redis组件》开篇:我要带你从零开始手搓一个彻底解决缓存击穿、穿透和雪崩问题的高性能Redis组件
作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)
沉淀,成长,突破,帮助他人,成就自我。
- 本章难度:★☆☆☆☆
- 本章重点:主要介绍在接下来的一段时间中,冰河要带着大家从零开始,手写一个彻底解决缓存击穿、穿透和雪崩问题的高性能通用Redis组件,支持各种高并发、高性能场景、支持各种灵活多变的复杂Redis读写场景,并对组件进行完整的单元测试和基准性能测试,最终达到可直接应用于生产环境的标准。
大家好,我是冰河~~
在带着大家完成从零开始手搓《高性能脱敏组件 (opens new window)》项目后,这段时间冰河又带着大家完成了一个相当硬核的技术专栏,那就是星球的《性能优化 (opens new window)》专栏,在《性能优化 (opens new window)》专栏中,包含21个篇章,涵盖了性能优化的绝大部分场景和优化方案,让大家能够系统性的彻底掌握大厂对于性能优化的核心技术。
在完成《性能优化 (opens new window)》专栏后,冰河又要带着大家搞新项目了,这也是 冰河技术 知识星球继《手写高性能脱敏组件 (opens new window)》、《手写线程池 (opens new window)》、《手写高性能SQL引擎 (opens new window)》、《手写高性能Polaris网关》 (opens new window)、《手写高性能RPC》 (opens new window)、 《Seckill秒杀系统》 (opens new window) 和《分布式IM即时通讯系统》 (opens new window)、《手写高性能熔断组件 (opens new window)》、《手写高性能监控组件 (opens new window)》、《简易商城脚手架 (opens new window)》等诸多项目后,又一个带着大家手写大厂必备基础组件的项目和专栏。星球其他项目与专栏,大家可移步到冰河的个人站点:https://binghe.gitcode.host (opens new window) 进行查看。

没错,在今后一段时间内,冰河又要带着大家搞事情了,那就是带着大家从零开始,手写一个大厂必备的的高性能Redis组件,彻底解决缓存击穿、穿透和雪崩问题,支持各种高并发、高性能场景,支持各种灵活多变的复杂Redis读写场景,并对组件进行完整的单元测试和基准性能测试,最终达到可直接应用于生产环境的标准。
这可能是你职业生涯中最具含金量的一次点击,点击【查看更多 (opens new window)】了解冰河技术知识星球更多硬核技术和优质项目。
这里,会涉及到很多互联网大厂研发过程中所使用的核心技术和架构设计模式,也有冰河在互联网大厂工作过程中,自主研发和深度参与基础软件和基础中间件架构设计和研发过程中所使用到的核心技术。更重要的是,项目中积累了冰河在解决大厂基础架构问题和灵活多变的复杂业务与中间件问题的经验。

在《手写高性能Redis》项目中,你学到的不仅仅是一个大厂必备的的防缓存击穿、穿透和雪崩的高性能Redis组件,更重要的是要学会大厂在应对高并发、大流量场景时,防缓存击穿、穿透和雪崩问题的技术方案和架构设计思想以及落地实践经验,并学会如何将这些技术方案和架构设计思想落地到实际项目中。
# 一、项目背景
记得在《【高并发】Redis如何助力高并发秒杀系统?看完这篇我彻底懂了!! (opens new window)》一文中,我们以高并发秒杀系统中扣减库存的场景为例,说明了Redis是如何助力秒杀系统的。那么,说到Redis,往往更多的场景是被用作系统的缓存,说到缓存,尤其是分布式缓存系统,在实际高并发场景下,稍有不慎,就会造成缓存穿透、缓存击穿和缓存雪崩的问题。

为此,有不少小伙伴问我:什么是缓存穿透?什么是缓存击穿,什么是缓存雪崩呢?它们是如何造成的?又该如何解决呢?能不能带着我们写一个彻底解决缓存击穿、穿透和雪崩问题的项目呢?以便后续使用到自己的实际业务项目中。
所以,冰河开始筹划带着大家从零开始手搓一个彻底解决缓存击穿、穿透和雪崩问题的高性能Redis组件,这个项目不仅仅是从理论上来阐述这些内容,更是要带着大家一起手搓生产级高并发场景下缓存击穿、穿透和雪崩问题解决方案的落地代码,让大家掌握的不仅仅是理论知识,更是落地到代码的解决方案。
# 二、适用场景
高性能Redis组件旨在彻底解决缓存击穿、穿透和雪崩问题,支持各种高并发、高性能场景,支持各种灵活多变的复杂Redis读写场景。既然高性能Redis组件要彻底解决缓存击穿、穿透和雪崩问题,那到底什么是缓存击穿、穿透和雪崩问题,理论上又有哪些解决方案呢?
# 2.1 缓存击穿
如果我们为缓存中的大部分数据设置了相同的过期时间,则到了某一时刻,缓存中的数据就会批量过期。
# 2.1.1 什么是缓存击穿?
如果缓存中的数据在某个时刻批量过期,导致大部分用户的请求都会直接落在数据库上,这种现象就叫作缓存击穿。
可以使用下图来表示缓存击穿的线程。

造成缓存击穿的主要原因就是:我们为缓存中的数据设置了过期时间。如果在某个时刻从数据库获取了大量的数据,并设置了相同的过期时间,这些缓存的数据就会在同一时刻失效,造成缓存击穿问题。
# 2.1.2 如何解决缓存击穿问题?
对于比较热点的数据,我们可以在缓存中设置这些数据永不过期;也可以在访问数据的时候,在缓存中更新这些数据的过期时间;如果是批量入库的缓存项,我们可以为这些缓存项分配比较合理的过期时间,避免同一时刻失效。
还有一种解决方案就是:使用分布式锁,保证对于每个Key同时只有一个线程去查询后端的服务,某个线程在查询后端服务的同时,其他线程没有获得分布式锁的权限,需要进行等待。不过在高并发场景下,这种解决方案对于分布式锁的访问压力比较大。
# 2.2 缓存穿透
缓存穿透问题在一定程度上与缓存命中率有关。如果我们的缓存设计的不合理,缓存的命中率非常低,那么,数据访问的绝大部分压力都会集中在后端数据库层面。
# 2.2.1 什么是缓存穿透?
如果在请求数据时,在缓存层和数据库层都没有找到符合条件的数据,也就是说,在缓存层和数据库层都没有命中数据,那么,这种情况就叫作缓存穿透。
可以使用下图来表示缓存穿透的现象。

造成缓存穿透的主要原因就是:查询某个Key对应的数据,Redis缓存中没有相应的数据,则直接到数据库中查询。数据库中也不存在要查询的数据,则数据库会返回空,而Redis也不会缓存这个空结果。这就造成每次通过这样的Key去查询数据都会直接到数据库中查询,Redis不会缓存空结果。这就造成了缓存穿透的问题。
# 2.2.2 如何解决缓存穿透问题?
既然我们知道了造成缓存穿透的主要原因就是缓存中不存在相应的数据,直接到数据库查询,数据库返回空结果,缓存中不存储空结果。
那我们就自然而然的想到了第一种解决方案:就是把空对象缓存起来。当第一次从数据库中查询出来的结果为空时,我们就将这个空对象加载到缓存,并设置合理的过期时间,这样,就能够在一定程度上保障后端数据库的安全。
第二种解决缓存穿透问题的解决方案:就是使用布隆过滤器,布隆过滤器可以针对大数据量的、有规律的键值进行处理。一条记录是不是存在,本质上是一个Bool值,只需要使用 1bit 就可以存储。我们可以使用布隆过滤器将这种表示是、否等操作,压缩到一个数据结构中。比如,我们最熟悉的用户性别这种数据,就非常适合使用布隆过滤器来处理。
# 2.3 缓存雪崩
如果缓存系统出现故障,所有的并发流量就会直接到达数据库。
# 2.3.1 什么是缓存雪崩?
如果在某一时刻缓存集中失效,或者缓存系统出现故障,所有的并发流量就会直接到达数据库。数据存储层的调用量就会暴增,用不了多长时间,数据库就会被大流量压垮,这种级联式的服务故障,就叫作缓存雪崩。
可以用下图来表示缓存雪崩的现象。

造成缓存雪崩的主要原因就是缓存集中失效,或者缓存服务发生故障,瞬间的大并发流量压垮了数据库。
# 2.3.2 如何解决缓存雪崩问题?
解决缓存雪崩问题最常用的一种方案就是保证Redis的高可用,将Redis缓存部署成高可用集群(必要时候做成异地多活),可以有效的防止缓存雪崩问题的发生。
为了缓解大并发流量,我们也可以使用限流降级的方式防止缓存雪崩。例如,在缓存失效后,通过加锁或者使用队列来控制读数据库写缓存的线程数量。具体点就是设置某些Key只允许一个线程查询数据和写缓存,其他线程等待。则能够有效的缓解大并发流量对数据库打来的巨大冲击。
另外,我们也可以通过数据预热的方式将可能大量访问的数据加载到缓存,在即将发生大并发访问的时候,提前手动触发加载不同的数据到缓存中,并为数据设置不同的过期时间,让缓存失效的时间点尽量均匀,不至于在同一时刻全部失效。
至此,我们已经了解了什么是缓存击穿、穿透和雪崩,也了解了如何解决这些问题。那落地到代码该如何实现呢?这就是我们手写的高性能Redis组件要解决的问题。
# 三、适应人群
大厂向来注重性能,并且在高并发、大流量场景下是绝对不允许出现缓存击穿、穿透和雪崩问题。否则,一旦出现这些问题,大量流量打向数据库,数据库由于根本扛不住这么大的流量而被瞬间击垮,导致整个系统都可能陷入瘫痪和宕机,那势必为大厂带来巨大的经济损失。所以,大厂是绝对不允许出现缓存击穿、穿透和雪崩问题的。
所以,熟练掌握缓存击穿、穿透和雪崩问题的基本概念和常用的解决方案,已经是进大厂必备的基础技能。如果小伙伴们现在已经在大厂,亦或是想要进入大厂,那高性能Redis组件是你必须要掌握的。

如果小伙伴们已经在大厂,不了解缓存击穿、穿透和雪崩问题的处理方案,或者想要进入大厂,亦或是一直突破不了自己的技术瓶颈,平时受如下问题困扰,可以跟冰河一起学习手写高性能Redis组件,从根本上突破自己的技术瓶颈,积累更多大厂处理实际问题的经验。

- 刚毕业,想快速提升自己,快速积累缓存相关问题的处理方案经验,但不知从何学起。
- 校招、社招没什么拿的出手的项目,简历上写的项目没啥含金量,投出的简历石沉大海。
- 一直在小公司做CRUD,数据量也不多,公司规范不健全,根本不知道还有缓存击穿、穿透和雪崩这回事。
- 公司项目没什么并发,在线人数也不多,系统并发量不高,只是简单的CRUD就能满足需求。
- 学了一些缓存相关的知识,也知道一些基本概念,能说出一些简单的方案,但是没实际项目经验。
- 自我感觉掌握了一些缓存击穿、穿透和雪崩问题的处理方案,但是在真正做项目时,还是不知道如何下手,面试时也是一脸懵逼。
- 想做一些缓存处理相关的中间件和业务项目,根本不知道怎么做,更别提架构设计和研发了。
- 简历上写了了解或熟悉缓存击穿、穿透和雪崩问题的处理方案,在面试过程中,面试官一般会基于简历循序渐进深入发问,不知道怎么回答。
- 在大厂工作多年,参与了一些系统的建设与研发,但是也没机会参与缓存问题处理方案的整个建设过程,很难积累系统性处理缓存问题的方案知识。
- 其他问题。。。
从各位小伙伴的反馈来看,小公司的小伙伴受限于业务,接触不到高并发、大流量的业务场景,也不会涉及到缓存击穿、穿透和雪崩问题。
大厂的小伙伴由于某些原因接触不到缓存问题处理方案的整个建设过程,很难积累缓存击穿、穿透和雪崩问题处理方案的知识。没有系统性落地成实际项目的经验,很难成体系的积累处理缓存问题方案的编程经验。

所以,如果你正在被如上问题所困扰,不妨跟冰河一起学习下手写高性能Redis组件项目,向前迈出一小步,或许困扰你的问题就能迎刃而解。
# 四、技术选型
这次带着大家一起手写的高性能Redis组件,在代码结构上非常精简,核心功能就是解决缓存击穿、穿透和雪崩问题。主要的技术选型如下:
- 容器框架:Spring(不强制依赖)
- Redis框架:Redisson(不强制依赖)
- 单元测试:Junit(不强制依赖)
- 基准性能测试:JMH(不强制依赖)
# 五、系统大纲
为了大家能够更好的学习和理解高性能Redis组件项目,这里会将整体专栏分成几部分,大致的专栏提纲如下所示。
第01部分:需求分析
- 第01节:开篇介绍
- 第02节:缓存痛点问题梳理
- 第03节:...
第02部分:架构设计
- 第01节:总体方案目标和架构设计
- 第02节:高性能Redis组件的通用化落地
- 第03节...
第03部分:核心功能设计
第01节:存储模型与类型转换设计与实现
第02节:缓存基础功能设计与实现
第03节:带参数防缓存穿透查询数据的设计与实现
第04节:不带参数防缓存穿透查询数据的设计与实现
第05节:带参数防缓存穿透查询列表数据的设计与实现
第06节:不带参数防缓存穿透查询列表数据的设计与实现
第07节:...
第04部分:测试验证
- 第01节:单元测试场景验证
- 第02节:JMH基准性能测试
- 第03节:...
第05部分:...
- 第01节:...
第06部分:...
- 第01节:...
注意:上述大纲在实际专栏推进过程中,由于专栏需要,可能会发生变化。
整体课程采用视频+小册+源码+1v1问答形式,加入星球即可加入专属交流群,并且星球提供了简历优化服务,还为大家准备了1000+精美简历模板,助力小伙伴们升职加薪,让你在面试过程中更具竞争力。加入星球,猛戳如下链接获取1000+精美简历模板。
# 六、如何学习
1.加入 冰河技术 知识星球(文末有知识星球优惠券,高性能Polaris网关项目已完结,即将涨价),才能查看星球专栏文章,学习专栏视频课程,查看星球置顶消息,申请加入项目,才能看到项目代码和技术小册,如果未申请加入项目,点击项目链接,你会发现是404页面。
2.专栏的每一章会对应一个代码分支,学习视频和专栏文章时,大家对照代码分支学习即可。
3.学习过程中最好按照章节顺序来学习,每一章前后都是比较连贯的,并且每一章的代码实现也有先后顺序,这样按照从前往后的顺序学习,最终你会实现一个完整的高性能Redis组件项目。
注意:学习的过程,不是复制粘贴代码的过程,赋值粘贴代码是没有任何意义的,最好的学习方式就是自己动手实现代码,然后思考、总结。
4.代码结构:master分支是最新的全量代码,专栏中每一个章节和视频都会对应一个代码分支,切换到章节对应的代码分支后,即可根据当前章节和视频学习对应的代码实现,不然,在master分支中看到的是全量的代码。
5.对应代码实现上的问题,可以在专栏对应的源码提issuse。
6.冰河会为《手写高性能Redis组件》专栏录制完整的视频课程。
# 七、写在最后
在冰河的知识星球除了手写高性能Redis组件和热更的RPC视频外,还有其他十几个项目,像DeepSeek大模型、手写高性能敏组件、手写线程池、手写高性能SQL引擎、手写高性能Polaris网关、手写高性能熔断组件、手写通用指标上报组件、手写高性能数据库路由组件、手写分布式IM即时通讯系统、手写Seckill分布式秒杀系统、手写高性能RPC、实战高并发设计模式、简易商城系统等等。
这些项目的需求、方案、架构、落地等均来自互联网真实业务场景,让你真正学到互联网大厂的业务与技术落地方案,并将其有效转化为自己的知识储备。
值得一提的是:冰河自研的Polaris高性能网关比某些开源网关项目性能更高,并且冰河也正在为企业级高性能RPC框架录制视频,全程带你分析原理和手撸代码。
你还在等啥?不少小伙伴经过星球硬核技术和项目的历练,早已成功跳槽加薪,实现薪资翻倍,而你,还在原地踏步,抱怨大环境不好。抛弃焦虑和抱怨,我们一起塌下心来沉淀硬核技术和项目,让自己的薪资更上一层楼。

目前,领券加入星球就可以跟冰河一起学习《DeepSeek大模型》、《手写高性能脱敏组件》、《手写线程池》、《手写高性能SQL引擎》、《手写高性能Polaris网关》、《手写高性能RPC项目》、《分布式Seckill秒杀系统》、《分布式IM即时通讯系统》《手写高性能通用熔断组件项目》、《手写高性能通用监控指标上报组件》、《手写高性能数据库路由组件》、《手写简易商城脚手架项目》、《Spring6核心技术与源码解析》和《实战高并发设计模式》,从零开始介绍原理、设计架构、手撸代码。
花很少的钱就能学这么多硬核技术、中间件项目和大厂秒杀系统与分布式IM即时通讯系统,比其他培训机构不知便宜多少倍,硬核多少倍,如果是我,我会买他个十年!
加入要趁早,后续还会随着项目和加入的人数涨价,而且只会涨,不会降,先加入的小伙伴就是赚到。
另外,还有一个限时福利,邀请一个小伙伴加入,冰河就会给一笔 分享有奖 ,有些小伙伴都邀请了50+人,早就回本了!
# 八、其他方式加入星球
- 链接 :打开链接 http://m6z.cn/6aeFbs 加入星球。
- 回复 :在公众号 冰河技术 回复 星球 领取优惠券加入星球。
特别提醒: 苹果用户进圈或续费,请加微信 hacker_binghe 扫二维码,或者去公众号 冰河技术 回复 星球 扫二维码加入星球。
好了,今天就到这儿吧,我是冰河,我们下期见~~