漫话:如何给女朋友解释什么是缓存穿透、缓存击穿、缓存雪崩?

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇

作者丨漫话编程

来源丨漫话编程(ID:mhcoding)

周末在家面试,和候选人聊到Redis的问题,于是问了他一个问题:你知道缓存穿透、缓存击穿和缓存雪崩吗?他们之间的区别是什么?分别怎么解决吗?

面试结束后,女朋友好像有很多问号,于是来问我。

c54dc68fd655bf7227cd8811dc898048.png

a190ceee79265418d3d970d0ddc69513.png

5835b9274b59dec15f8dfabf3044b1cd.png

67f41db45e70b0d3837b1bd86a4878c5.png

fe4d7e4b64e1e9d986790ac3e12680df.png

6b8cfb4c5c76c034f27277e79dfd9e37.png

缓存穿透

要把这个问题讲清楚,先举个例子。

一个女孩子去门店买口红,到了门店之后被告知她想要的那个色号已经没有了。于是她要求店员去问总部还有没有货。总部发现这个色号也没有了,于是女孩子就离开了。

过了一会另一个女孩子又来了,也想要购买同一个色号,店员就又总部问了一次。如此反复。

女孩子买口红不仅需要门店帮忙查询,还需要总部也进行盘货。类似这种情况,在缓存领域有一个类似的概念叫做缓存穿透

6dcb4d7819291123d58878d51326feea.png

缓存穿透是指缓存服务器中没有缓存数据,数据库中也没有符合条件的数据,导致业务系统每次都绕过缓存服务器查询下游的数据库,缓存服务器完全失去了其应用的作用。

0781e7e5499a5b9be096843b0c5fd1ea.png

165dd26dfdac2a5ff2e1694ed7da1ceb.png

b6c61c9c1a6f43e0511a3156a2c60980.png

44ce410402e8235023de7c30084fed78.png

缓存空值

解决多次询问总部的方法比较简单,如果口红门店在帮第一个女孩子查询之后,就记录下来这个色号已经没有了,下次其他女孩再来问这个色号的时候,直接告诉她没货了。

这样就可以避免每次都惊动总部了。

在缓存中,之所以会发生穿透,就是因为缓存没有对那些不存在的值得Key缓存下来,从而导致每次查询都要请求到数据库。

那么我们就可以为这些key对应的值设置为null并放到缓存中,这样再出现查询这个key 的请求的时候,直接返回null即可 。

但是还需要注意的就是需要有一个失效时间,因为如果不设置失效的话,如果哪天总部有货了,门店还是当做没货的话,就会影响销量了。

BloomFilter

很多时候,缓存穿透是因为有很多恶意流量的请求,这些请求可能随机生成很多Key来请求查询,这些肯定在缓存和数据库中都没有,那就很容易导致缓存穿透。

针对类似的情况,可以使用一个过滤器。

比如如果有一群人经常来门店问一些根本不存在的色号,比如五彩斑斓的黑,这些色号该品牌根本没生产过的话,店员就可以直接告诉顾客不存在就行了,也不需要惊动总部。

在缓存穿透防治上常用的技术是布隆过滤器(Bloom Filter)

布隆过滤器是一种比较巧妙的概率性数据结构,它可以告诉你数据一定不存在或可能存在,相比Map、Set、List等传统数据结构它占用内存少、结构更高效。

对于缓存穿透,我们可以将查询的数据条件都哈希到一个足够大的布隆过滤器中,用户发送的请求会先被布隆过滤器拦截,一定不存在的数据就直接拦截返回了,从而避免下一步对数据库的压力。

eb6a982a47acdc72ef9ecfb2834f5996.png

c2f7d8a10025881a51d0bae369ee407b.png

115e87345e2bb620744d58b8bcdaa61f.png

30761d484703254901d27f5e0e56a1cb.png

缓存击穿

有一种比较特殊的情况,那就是如果某一个热门色号的口红刚好卖完了,这时候有很多顾客同时来咨询要购买这个色号,那么门店内的多个售货员可能分别给总部打电话咨询是否有存货。

或者如果有多家门店同时卖完了,那么总部接收到的咨询量就会剧增。类似这种情况,在缓存领域有一个类似的概念叫做缓存击穿

35241a385c66d1a34cd7b31509b16659.png

缓存击穿是指当某一key的缓存过期时大并发量的请求同时访问此key,瞬间击穿缓存服务器直接访问数据库,让数据库处于负载的情况。

7ecabe4dee0e585c8ca2178cd2b8c9a4.png

164b12a151aa7fd2c8d317877f491d92.png

9f77e82edc81434c8322b513c3ca766e.png

29a1aef0a477bb8610f0f6d88e621e0a.png

异步定时更新

如果提前知道某一个色号比较畅销的话,那就可以定时的咨询总部是否还有存货,定时的更新库存情况就可以避免上面这种情况了。

在缓存处理上,同理,比如某一个热点数据的过期时间是1小时,那么每59分钟,通过定时任务去更新这个热点key,并重新设置其过期时间。

互斥锁

还有一种解决办法,那就是如果很多顾客咨询的是同一个色号的口红,那么就先处理第一个用户的咨询,其他同样请求的顾客先排队等待。一直到店员从总部那里获取到最新的库存信息后,就可以安排其他人继续购买了。

在缓存处理上,通常使用一个互斥锁来解决缓存击穿的问题。简单来说就是当Redis中根据key获得的value值为空时,先锁上,然后从数据库加载,加载完毕,释放锁。若其他线程也在请求该key时,发现获取锁失败,则先阻塞。

5038b9498ff963c81e5d0fc0de8ae947.png

85d8061b7c126af351b8e7a638607298.png

9e43f75ad4722f0f67182f511b137ace.png

e6d9ec41d114d6065547f615f9fc0a81.png

fafb72b07940a5e7df2d88c0e1717545.png

缓存雪崩

如果门店内的多个色号的口红同时售罄了,并且门店在这个时间点刚好也不知道总部有没有库存了,这时候如果有大量顾客来到门店购物的话,就会有更多的咨询电话打到总部那里。

或者是门店突然出现问题了,不能提供服务了,很多顾客就可能自己打电话到总部咨询库存情况。类似这种情况,在缓存领域有一个类似的概念叫做缓存雪崩

2b0727fc85b74c9cfa42d80be7c9effc.png

缓存雪崩是指当大量缓存同时过期或缓存服务宕机,所有请求的都直接访问数据库,造成数据库高负载,影响性能,甚至数据库宕机。

0300f3c7e90ea7496073d79689865126.png

87c6adce4ed48216537987f1638896fa.png

1aa26a4139ff2ac75ba4dc4319d5ea3d.png

827e34862aec77ffd4ba477799094842.png

不同的过期时间

为了避免缓存雪崩,门店可以考虑给不同的色号的口红预留不同的库存,并且采用不同的频率咨询总部库存情况,更新到门店中。这样就可以避免突然同一个时间点所有色号都售罄。

为了避免大量的缓存在同一时间过期,可以把不同的key过期时间设置成不同的, 并且通过定时刷新的方式更新过期时间。

集群

为了避免门店出问题导致大量顾客直接打电话到总部,可以考虑开更多的门店,将用户分流到多个店铺中。

类似的,在缓存雪崩问题防治上面,一个比较典型的技术就是采用集群方式部署,使用集群可以避免服务单点故障。

b2c40fc5a9318afb5bfb5cfe628d4e34.png

27ce6e6a7ee94fd2ae0fbdddc7a85f01.png

0b5561e35390248e956ff242a0767417.png

68b0b48a19b65021cdf6967dd1ebf737.png

00c33f7eecc4526e52bbf41465bf9582.png


关于作者漫话编程,是一个通过漫画+音频的形式讲解枯燥的编程知识的公众号。致力于让编程变得更有乐趣。

-End-

最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!

e4bb99b8721c0556e81d1582ea8b5eaa.png

点击👆卡片,关注后回复【面试题】即可获取

在看点这里4ce7183fbac234b34567141f3d8259ab.gif好文分享给更多人↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值