缓存击穿和缓存雪崩,这俩词儿听起来就挺高级的,我得好好解释解释。
缓存击穿嘛,这就像你手里有个热馒头,突然有一天,那馒头被戳了一个洞,热气就都跑光了。在系统里,缓存击穿就是某个热点key在失效后,突然有大量的请求过来,这些请求都去查数据库,因为缓存里没有了。
而缓存雪崩,那更严重了,就像是整个仓库的雪都开始崩塌,一片片雪花砸下来。这种情况发生在缓存中大量key同时过期,导致系统瞬间被请求淹没,整个系统就崩溃了。
举个例子,2022年,某个电商城市,因为一个爆款商品突然下架,缓存中该商品的key集体过期,瞬间涌入了成千上万的请求,系统就崩溃了,损失了多少钱,我后来才反应过来,可能我偏激了。
上次有个客人问我缓存击穿和缓存雪崩的区别,这俩玩意儿其实挺相似的,但细看还是有挺大差别的。
先说缓存击穿吧。2023年我在北京某互联网公司做技术支持的时候,有一次我们系统里的一个热门缓存突然崩溃了,导致服务出现了大范围的故障。后来排查发现,是因为缓存里的一个热点key过期了,但是请求还是源源不断地过来,直接把数据库压垮了。这就是缓存击穿,简单来说,就是某个热点key突然过期了,大量请求直接打到了数据库上。
再说说缓存雪崩。我之前在杭州的一家公司也遇到过类似的情况。那一次是整个缓存的过期时间设置得不太合理,导致在某个时间点,大量缓存同时过期,这时候系统里的请求又没有足够的缓存去响应,结果就是雪崩效应,整个系统几乎瘫痪了。
总结一下,缓存击穿是单个热点key的问题,而缓存雪崩是整个缓存的问题。缓存击穿可能是因为key过期,缓存雪崩可能是因为过期策略不合理。这两种情况都需要我们在设计缓存的时候就要考虑好,避免系统出现大问题。反正你看着办,这两种情况的处理方法还是有些不同的,得根据实际情况来。我还在想这个问题呢。
缓存击穿和缓存雪崩,这俩词儿听起来好像一个意思,其实啊,它们是两码事。
缓存击穿,这得从2012年说起,那时候我在一个论坛上看到一个帖子,说的是某个网站的用户量突然暴涨,导致数据库直接崩溃了。当时也没想明白,后来才明白,缓存击穿是因为某个热门数据在缓存中突然失效,导致大量的请求直接打到数据库上,就像一把利剑直接穿透了缓存层。
缓存雪崩呢,那是2014年左右的事了。有一次我负责的一个项目,因为缓存中大量数据同时过期,导致整个系统崩溃。当时真的慌了,后来总结出来,缓存雪崩就是缓存中大量数据同时过期或失效,导致请求全部打到数据库上,就像雪花一样,铺天盖地,最后把数据库压垮了。
简单来说,缓存击穿是一个点的问题,就像一个热门数据失效了;缓存雪崩是一个面的问题,整个缓存层都出了问题。用数字来说,缓存击穿可能是1个请求打爆数据库,缓存雪崩可能是成千上万的请求同时打爆数据库。
这俩区别,一个是局部问题,一个是全局问题;一个是突然的,一个是逐渐发生的。所以说,搞清楚缓存击穿和缓存雪崩的区别,对于做系统架构的来说,还是很重要的。
缓存击穿和缓存雪崩,一个像穿针,一个像崩塌。
缓存击穿,就像你手里有个针,本来想穿过一个孔,结果孔里没东西,针就卡住了。缓存里某个键值久未更新,突然来请求,缓存里没货,直接去数据库,这就是击穿。
缓存雪崩,就像一堆雪突然全崩了。缓存里很多键值同时过期,大量请求都去数据库,数据库压力山大,这就是雪崩。
总结一下,击穿是个别问题,雪崩是大规模问题。