Redis缓存穿透,缓存击穿,缓存雪崩原因+解决方案

一、什么是缓存穿透,缓存击穿,缓存雪崩

缓存穿透:(即查询不到)key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。

缓存击穿:(即量太大,缓存过期)key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

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

缓存雪崩,是指在某一个时间段,缓存集中过期失效。Redis 宕机!

二、解决方案

缓存穿透

1、使用布隆过滤器

对所有可能查询的参数以Hash的形式存储,以便快速确定是否存在这个值,在控制层先进行拦截校验,校验不通过直接打回,减轻了存储系统的压力。

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

存储空对象也需要空间,大量的空对象会耗费一定的空间,存储效率并不高。解决这个缺陷的方式就是设置较短过期时间

缓存击穿

1.设置热点数据永不过期

这样就不会出现热点数据过期的情况,但是当Redis内存空间满的时候也会清理部分数据,而且此种方案会占用空间,一旦热点数据多了起来,就会占用部分空间。

2.加互斥锁(分布式锁)

在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。保证同时刻只有一个线程访问。这样对锁的要求就十分高。

缓存雪崩

1、在设置缓存时间时加上一个随机数,避免大量数据同时过期
2、通过加锁限制对DB的大量请求
3、二级缓存

你可能感兴趣的:(Redis缓存穿透,缓存击穿,缓存雪崩原因+解决方案)