Redis 缓存雪崩、击穿、穿透

Redis 缓存雪崩、击穿、穿透

 

缓存雪崩

问题描述

缓存在同一时间大面积失效,造成大量数据请求不能命中缓存,而造成数据库查询请求瞬间爆发而宕机。

 

解决方法

  1. 加锁或者队列,保证不会有大量线程对数据库进行读写。
  2. 给过期时间加上随机值,避免它们在同一时刻同时失效。
  3. 缓存永不过期,数据有更新时主动去刷新缓存。

 

缓存穿透

问题描述

指的是请求缓存和数据库都没有的数据,比如请求id=-1的用户,因为缓存不存在,所以每次都会请求数据库。攻击者可能会利用这一点,伪造大量这种无效ID请求,来拖垮数据库。

 

解决方法

  1. 对查询条件进行合法性校验,比如对id<0的请求,直接返回空。
  2. 如果数据库查询结果返回为空,仍然把空值进行缓存。不过它的过期时间应该设置为很短,因为这次没值,不代表下个时间没值。
  3. 采用布隆过滤器,快速判断数据是否在数据库里,从而避免对数据库的查询压力。

 

缓存击穿

问题描述

当大量的请求同时查询一个 key 时,如果这个key正好失效了,就会导致大量的请求都打到数据库上面去。

解决方法

  1. 通过增加互斥锁,在多个线程请求同一个key的情况下,因为有锁存在,保证了第一个线程取到数据之后,才允许下个线程查询。