缓存穿透
概念
用户查询一个数据,redis没有,就是缓存无命中,于是向持久层数据库请求查询,发现也没有,查询失败。当很多用户一起查询的时候,持久层数据库压力很大,可能导致崩溃,就是缓存穿透。
解决方案:布隆过滤器
对所有可能查询的数据以hash形式存储,先进行校验,不符合直接丢弃。
解决方案:缓存空对象
当存储层不命中之后,缓存一个空对象,设置一个过期时间,之后在访问这个数据从缓存中获取,保护了后端数据源
但是空对象缓存,占用了资源
对于保持一致性的业务可能会有影响
缓存击穿
击穿是指一个key非常热点,高并发集中对一个点进行访问,在某个瞬间可能key失效了,导致高并发访问数据库。
解决方案:设置热点数据不过期
解决方案:加互斥锁
使用分布式锁,使每一个key同时只有一个线程可以访问后端服务,其他线程没有获取分布式锁的权限,因此只需要等待即可,这种方式将高并发的压力转移到了分布式锁。
缓存雪崩
某一个时间段,缓存集中过期,或者服务器宕机/断网
比如双十二,618把数据放入缓存,那么到了半夜1点,商品的缓存很可能都过期了。那么查询就回到了数据库中,导致崩溃。
解决方案:redis集群高可用
解决方案:限流降级
缓存失效后,还是加锁和队列来控制数据库写缓存的线程数量
解决方案:数据预热
在正式部署之前,把可能出现的数据先预先访问一遍,这样部分大量访问的商品数据就会加载到缓存中,在将发生大并发前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。