Redis 缓存穿透/缓存击穿/缓存雪崩解决方案_缓存

一、缓存穿透

缓存穿透是指查询一个缓存和数据库中都没有的数据,由于大部分缓存策略是被动加载的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。用户不断发起请求,在流量大时,就可能对DB形成巨大的压力,利用不存在的key频繁攻击应用也是很大的问题。

解决方案:

1、缓存和数据库中都不存在的数据,可以将此key对应的value设置为一个默认的值,比如“NULL”,并设置一个缓存的失效时间,这时在缓存失效之前,所有通过此key的访问都被缓存挡住了。后面如果此key对应的数据在DB中存在时,缓存失效之后,通过此key再去访问数据,就能拿到新的value了。

2、接口层增加校验,比如用户鉴权校验,id根据数据场景做基础校验,id<=0的直接拦截。

二、缓存击穿

缓存击穿是指缓存中的一个热点Key(比如一个秒杀商品),在某个时间点过期的时候,恰好在这个时间点访问量剧增,对这个Key有大量的并发请求过来,请求发现缓存过期一般都会从后端DB加载数据并回设回缓存,但就在缓存中的数据还没有完全从DB中加载过来的这个时间段期间,并发瞬间造成大量请求直接击穿到DB,对DB形成巨大压力。

缓存击穿,又叫热点key问题,是这三个问题中最经典的一个问题。

解决方案:

1、对热点key,加互斥锁。

2、设置热点数据永不过期。

3、资源保护,服务降级。

三、缓存雪崩

缓存雪崩,是指缓存中设置了大批量相同过期时间的数据同时过期失效,而在这一刻访问量剧增,缓存近乎失效,所有请求全部转向DB,DB瞬时压力过重雪崩,甚至down机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案:

1、设置热点数据永不过期。

1、过期时间设置随机,防止同一时间大量数据过期现象发生。

2、若redis缓存是分布式部署,可以把热点数据均匀分布在不同缓存数据库中。