缓存穿透,缓存击穿,缓存雪崩

前言

设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。

缓存穿透

访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。

大并发的缓存穿透会导致缓存雪崩。

解决方案

1.布隆过滤

采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。

2. 缓存空对象. 将 null 变成一个值.

如果一个查询返回的数据为空(不管是数据存不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

缓存雪崩

大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。

解决方案

1.用加锁或者队列的方式保证不会同时大量的并发请求落到底层存储系统上。

2.可以给缓存设置过期时间时加上一个随机值,使得每个key的过期时间分布开来,不会集中在同一时刻失效。

缓存击穿

一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。

解决方案

在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。

原文地址:https://www.cnblogs.com/mcahkf/p/9116897.html