缓存雪崩

在一个较短的时间内,缓存中较多的key过期,恰恰就是在较短的时间内,有很多请求访问过期key而未命中,让请求到达数据库数据库同时接收大量的请求,而无法及时处理,导致数据库崩溃.

解决:

1. 对key的过期时间进行分类错峰:均匀分布key的过期时间,避免大量key在较短时间内集中过期。设置过期时间时加个随机数。

2.超热key永不过期

缓存击穿

缓存击穿是指,针对某个访问非常频繁的热点数据的请求,无法在缓存中进行处理,紧接着,访问该数据的大量请求,一下子都发送到了后端数据库,导致了数据库压力激增,会影响数据库处理其他请求

解决:

1、在缓存访问非常频繁的热点数据时,不要设置过期时间。

为了避免缓存击穿给数据库带来的激增压力,我们的解决方法也比较直接,对于访问特别频繁的热点数据,我们就不设置过期时间了。这样一来,对热点数据的访问请求,都可以在缓存中进行处理,而 Redis 数万级别的高吞吐量可以很好地应对大量的并发请求访问

2、加互斥锁(缓存中没有数据,第1个进入的线程,获取锁并从数据库去取数据,没释放锁之前,其他并行进入的线程会等待100ms,再重新去缓存取数据。这样就防止都去数据库重复取数据,重复往缓存中更新数据情况出现)

缓存穿透

缓存穿透是指要访问的数据既不在 Redis 缓存中,也不在数据库中,导致请求在访问缓存时,发生缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据。此时,应用也无法从数据库中读取数据再写入缓存,来服务后续请求,这样一来,缓存也就成了“摆设”,如果应用持续有大量请求访问数据,就会同时给缓存和数据库带来巨大压力 两个原因:

1、业务层误操作:缓存中的数据和数据库中的数据被误删除了,所以缓存和数据库中都没有数据;

2、恶意攻击:专门访问数据库中没有的数据。

解决:

1、缓存空值或缺省值。对查询结果为null的数据也进行缓存,设定较短的过期时间

2、使用布隆过滤器快速判断数据是否存在,避免从数据库中查询数据是否存在,减轻数据库压力。

布隆过滤器:

(不是100%命中非法key)

布隆过滤器说某个元素存在,小概率会误判。布隆过滤器说某个元素不在,那么这个元素一定不在。

由于布隆过滤器使用了多个哈希函数,因此具有较低的冲突率。它可以高效地判断一个元素是否不存在于集合中,但存在一定的误判率(即判断元素存在于集合中,而实际上并不存在)。误判率取决于位数组的长度和哈希函数的数量。

 

参考:

https://zhuanlan.zhihu.com/p/670652600

posted on 2024-04-25 11:29  菜鸟乙  阅读(1)  评论(0编辑  收藏  举报