击穿:
当数据并发量非常大的时候,redis中的key在失效的瞬间,大量的并发请求会直接击穿Redis缓存来到数据库,疯狂的请求数据库,数据库I/O量直接爆炸
解决:
把热门key设置成永不过期,冷门设置成定时过期,可以写一个方法,当一个key突然成为爆款的时候,访问量达到一个量级的时候,把这个key设置成永不过期。
加锁排队,查询一次redis没查到的时候,加 同步锁(分布式锁),第一个进来查询的线程,再查一次Redis(双重检查锁),没查到再去数据库中查询,如果查到就说明有别的并发线程在数据库中查到了数据并保存在了Redis中,直接返回,如果没有查到就去数据库中查询并保存到Redis中。
雪崩:
缓存集中过期,或者说缓存服务器宕机,导致大量请求访问数据库。
解决:
集中失效:加锁排队的同时,设置随机过期时间
宕机:提前做好Redis集群,设置哨兵,一个宕机,另外的立马补上。
穿透:
缓存中不存在,数据库中也不存在,导致每次都去查询数据库,还查不到,但是还是浪费了数据库的性能来查询这个“查不到”的数据,如果是大量的线程并发的进行查询,那么此时的用户很可能是攻击者。
解决:
参数校验:无效参数,直接过滤。
缓存空对象:在解决击穿和雪崩的基础上缓存空对象,来查询我就返回null,但是要设置过期时间,有可能以后数据库里面会有。
布隆过滤器。
参与讨论
(Participate in the discussion)
参与讨论