Redis 缓存雪崩、击穿、穿透
缓存雪崩
问题描述
缓存在同一时间大面积失效,造成大量数据请求不能命中缓存,而造成数据库查询请求瞬间爆发而宕机。
解决方法
- 加锁或者队列,保证不会有大量线程对数据库进行读写。
- 给过期时间加上随机值,避免它们在同一时刻同时失效。
- 缓存永不过期,数据有更新时主动去刷新缓存。
缓存穿透
问题描述
指的是请求缓存和数据库都没有的数据,比如请求id=-1
的用户,因为缓存不存在,所以每次都会请求数据库。攻击者可能会利用这一点,伪造大量这种无效ID请求,来拖垮数据库。
解决方法
- 对查询条件进行合法性校验,比如对
id<0
的请求,直接返回空。 - 如果数据库查询结果返回为空,仍然把空值进行缓存。不过它的过期时间应该设置为很短,因为这次没值,不代表下个时间没值。
- 采用布隆过滤器,快速判断数据是否在数据库里,从而避免对数据库的查询压力。
缓存击穿
问题描述
当大量的请求同时查询一个 key 时,如果这个key正好失效了,就会导致大量的请求都打到数据库上面去。
解决方法
- 通过增加互斥锁,在多个线程请求同一个key的情况下,因为有锁存在,保证了第一个线程取到数据之后,才允许下个线程查询。