【Redis】缓存雪崩、穿透和击穿及解决方法

一、缓存雪崩

1. 什么是缓存雪崩?

缓存雪崩:redis中的缓存数据同一时间大面积的失效,导致请求全部去访问数据库,造成数据库短时间内承受大量请求而崩掉。

2. 解决方法
(1)将缓存失效时间分散开

在缓存的过期时间上,加上一个随机数,避免同时失效。

(2)redis高可用处理

增设几台redis,一台挂掉之后其他的还可以继续工作。

(3)限流降级

在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。

二、缓存穿透

1. 什么是缓存穿透?

缓存穿透:查询缓存和数据库中都没有的数据,每次请求从缓存获取不到,请求都会到数据库,如果大量请求访问数据,就会压垮数据库。

2. 解决方法:
(1)缓存空值

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

(2)使用布隆过滤器

快速判断数据是否在数据库中存在,不存在就return,不再对数据库查询,减轻数据库压力;存在就查询数据库。

(3)在请求入口的前端进行请求检测

对请求进行合法性检测,把恶意的请求(请求参数不合理、是非法值、字段不存在)直接过滤掉,不让它们访问后端缓存和数据库。

三、缓存击穿

1. 什么是缓存击穿?

缓存击穿:热点key被频繁访问时突然失效,从而导致大量请求直接访问数据库,导致数据库压力过大。

2. 解决方法:
(1)添加互斥锁

通过key值判断取出来的value是不是null;如果是null的话就让一个线程去db中查询,其他的线程进行等待;读取以后再更新到reids;

你可能感兴趣的:(缓存,redis,数据库)