关于Redis缓存雪崩、缓存穿透、缓存击穿、缓存预热、缓存更新、缓存降级的认识

最近在开发项目中遇到了缓存雪崩的问题,于是用文章的方式介绍下Redis中一些缓存知识。

1.缓存雪崩

缓存雪崩可以看成是一个原有缓存失效,新建缓存没有跟上,导致大量数据请求绕过缓存直接请求数据库

造成原因:首先设置了一个相同的过期时间,然后过一段时间出现大面积缓存失效。所有原本向缓存的数据请求都直接面向数据库,导致CPU和内存负载过大,从而造成数据库宕机。从而产生一系列连锁反应,导致系统崩溃。

解决方式

  1. 通过设置锁或者队列,避免大量请求直接向数据库一次性读写。从而避免失效时大量的并发请求落到底层存储系统上。

  2. 错开缓存的失效时间

2.缓存穿透

缓存穿透简单说就是发送一个无用的请求,在缓存里查不到数据,同时数据库里也不存在,从而返回一个空值。这样做就造成了两次无用查询。也相当于请求绕开了缓存直接访问数据库。

解决方式

  1. 设置步隆过滤器,就是将所有无用的数据请求,都hash到一个bitmap中,存在一个无用数据请求就被bitmap拦截,从而避免了请求访问压力

  2. 如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。通过这个直接设置的默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库

步隆过滤器:是一个很长的二进制向量和一系列随机映射函数。用来检测某一值是否存在集合中。

其优点:

空间效率和查询时间都远远超过一般的算法

缺点:

有一定的误识别率和删除困难

其算法为Bloom-Filter,核心为利用不同Hash函数来解决冲突。Hash存在一个冲突(碰撞)的问题,用同一个Hash得到的两个URL的值有可能相同。为了减少冲突我们可以多引入几个Hash,如果通过其中的一个Hash值我们得出某元素不在集合中,那么该元素肯定

不在集合中。只有在所有的Hash函数告诉我们该元素在集合中时,才能确定该元素存在于集合中。这便是Bloom-Filter的基本思想。

3.缓存击穿

缓存击穿与缓存穿透不同的是,缓存不存在数据,但是数据库却存在数据(发生的情况一般都是热点数据缓存时间过期)。这就会导致大量请求在缓存里面找不到数据从而直接请求数据库。造成数据库压力过大

解决方式

  1. 将热点数据缓存时间设置永不过期。

  2. 设置互斥锁,当一个请求拿到锁时,其他请求被阻塞,等待该请求完成再继续。

  3. 接口限流与熔断,降级。常用接口做好限流策略,防止用户恶意刷接口。同时要降级准备,当接口中的某些服务不可用时候,进行熔断,失败快速返回机制

4.缓存预热

缓存预热指将相关缓存数据直接加载到缓存系统。这样就可以让效率更快,不需要从数据库取到数据后,再到缓存中缓存该数据。

5.缓存更新

缓存更新:删错内存策略。当 缓存中请求量增多后,容易造成缓存里面数据量大。避免可用内存减少,于是就有了缓存更新这一个策略。但是在Redis中默认有6个删除策略。

6.缓存降级

缓存降级:当访问量增大后,系统出现了问题。就需要将一些不重要的服务进行降级操作。从而不影响到主服务的性能,且也不需要删除这些无用服务。

猜你喜欢

转载自blog.csdn.net/weixin_51220967/article/details/128318913