关于redis的几件小事(七)redis缓存雪崩与穿透
1.缓存雪崩
(1)什么是缓存雪崩
缓存雪崩指的是在同一时刻,缓存大量失效,导致大量的请求直接到了数据库,数据库压力剧增,引起系统崩溃。可能出现的情况有:
①大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。
②缓存系统出现故障,造成缓存系统无法提供服务,造成瞬时DB请求量大、压力骤增,引起雪崩。
(2)怎么避免缓存雪崩
事前 :
①在设置key的过期时间时,在过期时间上加上一个随机值,防止大量key同时过期。
②搭建高可用的缓存架构,比如使用 哨兵+主从 结构或者使用 cluster模式,避免缓存系统出现故障。
③可以在系统中使用ehcache做个小缓存,防止redis崩掉之后,还有一部分缓存。
事中 :
①对系统请求进行降级和限流,防止数据库之间崩掉。
事后 :
赶快使用redis持久化的数据,快速恢复缓存数据
2.缓存穿透
(1)什么是缓存穿透
缓存穿透是指有请求访问到了并不存在的数据,这样请求就会直接到达数据库,数据库就会压力剧增。
(2)怎么避免缓存穿透
①可以使用一个足够大的bitmap,将可能存在的key放到里面,请求过来先检查bitmap里面有么有,如果没有直接过滤掉这个请求。
②将数据库查询出来的空值也放到缓存里面去,是这个key对应一个空值,只是这个key设置的时间比较短。
3.缓存击穿
(1)什么是缓存击穿
一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到数据库,造成数据库请压力骤增。
(2)怎么避免缓存击穿
在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。