分布式系统「高性能」大招之——缓存背后的“毁灭种子”

分布式系统「高性能」大招之——缓存背后的“毁灭种子”

作者:跨界架构师 2020-07-08 11:59:52

存储

存储软件

分布式 布隆过滤器就是由一个很长的二进制向量和一系列随机映射函数组成,将确定不存在的数据构建到过滤器中,用它来过滤请求。

[[332833]]

缓存雪崩

我们多次提到了「cache miss」这个词,利用「cache miss」来更好的保障DB和缓存之间的数据一致性。

然而,任何事物都是有两面性的,「cache miss」在提供便利的同时,也带来了一个潜在风险。

这个风险就是「缓存雪崩」。

 

 

在图中的第二步,大量的请求并发进入,这里的一次「cache miss」就有可能导致产生「缓存雪崩」。

不过,虽然「cache miss」会产生「缓存雪崩」,但「缓存雪崩」并不仅仅产生于「cache miss」。

雪崩一词源于「雪崩效应」,是指像「多米勒骨牌」这样的级联反应。前面没顶住,导致影响后面,如此蔓延。(关于对应雪崩的方式参考之前的文章,文末放链接)

所以「缓存雪崩」的根本问题是:缓存由于某些原因未起到预期的缓冲效果,导致请求全部流转到数据库,造成数据库压力过重。

因此,流量激增、高并发下的缓存过期、甚至缓存系统宕机都有可能产生「缓存雪崩」问题。

怎么解决这个问题呢?宕机可以通过做高可用来解决(可以参考之前的文章,文末放链接)。而在“流量激增”、“高并发下的缓存过期”这两种场景下,也有两种方式可以来解决。

加锁排队

通过加锁或者排队机制来限制读数据库写缓存的线程数量。比如,下面的伪代码就是对某个key只允许一个线程进入的效果。

  1. key = "aaa"; 
  2. ​ 
  3. var cacheValue = cache.read(key); 
  4. if (cacheValue != null) { 
  5.  return cacheValue; 
  6. else { 
  7.  lock(key) { 
  8.  cacheValue = cache.read(key); 
  9.  if (cacheValue != null) { 
  10.  return cacheValue; 
  11.  }  
  12.  else { 
  13.  cacheValue = db.read(key); 
  14.  cache.set(key,cacheValue); 
  15.  } 
  16.  } 
  17.  return cacheValue; 

这个比较好理解,就不废话了。

缓存时间增加随机值

这个主要针对的是「缓存定时过期」机制下的取巧方案。它的目的是避免多个缓存key在同一时间失效,导致压力更加集中。

比如,你有10个key,他们的过期时间都是30分钟的话,那么30分钟后这10个key的所有请求会同时流到db去。

而这里说的这种方式就是将这10个key的过期时间打乱,比如设置成25、26、27、…、34分的过期时间,这样压力就被分散了,每分钟只有一个key过期。

最简单粗暴的方式就是在设置「过期时间」的时候加一个随机数字。

cache.set(key,cacheValue,30+random())

总体来看,相比后者,前者的适用面更广,所以Z哥建议你用「加锁排队」作为默认的通用方案不失为一个不错的选择。

「缓存穿透」、「缓存雪崩」傻傻分不清楚?

如果你听说过「缓存穿透」的话,可能会问:「缓存雪崩」和「缓存穿透」一样吗?

从产生的效果上看是一样的,但是过程不同。

来举个例子。例子纯属虚构,别太在意合理性。

在一个方圆一万里的地区内,只有一个修手机的老师傅。他收了一个徒弟,希望徒弟能帮他分担掉一部分的工作压力。这里的老师傅可以看作是DB,徒弟看作是缓存。

老师傅对徒弟说,如果遇到你不会做的事你来请教我。

然后,一个客户过来说要修一下他的卫星电话,徒弟去请教老师傅,老师傅说他也不会,先拒绝了吧。

但是由于没告诉他后续遇到修卫星电话的人该怎么做,所以后续这个客户一直来问,徒弟每次都又去请教老师傅。最终,在修卫星电话这件事上,徒弟并没有帮老师傅缓解任何的压力,快被烦死了。

上面这个故事就好比「缓存穿透」。

而「缓存雪崩」则是,由于徒弟年轻力壮,精力充沛,1小时能修20个手机,老师傅只能修10个(但是手艺好,更考究)。

然后,有一天徒弟请假了,但恰巧这天来了2000个修手机的,老师傅修不过来就被累垮了。

所以,「缓存穿透」和「缓存雪崩」最终产生的效果是一样的,就是因为大量请求流到DB后,把DB拖垮(正如前面故事中的老师傅)。

两者最大的不同在于,「缓存雪崩」问题只要数据从db中找到并放入缓存就能恢复正常(徒弟休假归来),而「缓存穿透」指的是所需的数据在DB中一直不存在的情况(老师傅也不会修)。并且,由于DB中数据不存在,所以自然每次从缓存中也找不到(徒弟也不会修)。

清楚了两者的区别之后,我们下面就来聊聊「缓存穿透」的常见应对方式。

缓存穿透

「缓存穿透」有时也叫做「缓存击穿」,产生的逻辑过程是这样,一直在虚线范围内流转。

 

 

在这种场景下,缓存的作用完全失效,每次请求都“穿透”到了DB中。

可能你会想,为什么会存在大量的这种db中数据不存在的情况呢?其实,任何依赖外部参数进行查询的地方都可能有这个问题的存在。比如,一个文本输入框,本来是让你输入用户名的,但是手误输入了密码,自然就找不到数据咯。更主要的问题是,会有恶意分子利用这种机制来对你的系统进行攻击,击穿缓存搞垮你的数据库,导致整个系统全面瘫痪。

同样也有两种方式来解决这个问题。

布隆过滤器(bloomfilter)

布隆过滤器就是由一个很长的二进制向量和一系列随机映射函数组成,将确定不存在的数据构建到过滤器中,用它来过滤请求。这里就放个图,具体就不展开了,后续我们再聊(有兴趣的可以先到搜索引擎搜《Space time trade-offs in hash coding with allowable errors》找到bloom的原始论文)。

实现代码其实并不很复杂,参考论文或者网上其他作者的一些实现就可以写出来。

不过,布隆过滤器有一个最大的缺点,也是其为了高效利用内存而付出的代价,就是无法确保100%的准确率。

所以,如果你的场景要求是100%准确的,就只能用下面这种方式了。

缓存空对象

其实就是哪怕从db中取出的数据是“空(null)”,也把它丢失到缓存中。

 

 

这样一来,虽然缓存中存在着一个value为空的数据,但是至少他能表示“数据库里也没有不用找了”。

其实这个思路和布隆过滤器有些类似,但是它对内存的消耗会大很多,毕竟布隆过滤器是利用的bit位来存储。不过这种方式的优势是前面提到的,不会出现误差,而布隆过滤器的错误率会随着「位数」的增加而减少,会不断趋近于0,但不会为0。

总结

好了,我们一起总结一下。

这次呢,Z哥主要和你聊了隐藏在缓存中的两颗具有“毁灭性”的种子,「缓存雪崩」和「缓存穿透」,以及应对这两颗种子的常用方式。

而且,顺便帮你区分清楚了「缓存雪崩」和「缓存穿透」的差异。

希望对你有所启发。

 

 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/231363.html<

(0)
运维的头像运维
上一篇2025-04-19 16:14
下一篇 2025-04-19 16:15

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注