一.缓存穿透
场景:外界访问数据库没有的操作,大量访问导致数据库宕机
解决的方案:
1.访问数据库后返回空值并将空值保存在缓存层,下次访问直接从缓存返回空值。
2.在缓存层外再加一个过滤器,redis自带的一个叫布隆过滤器,过滤数据库没有的key。
二.缓存击穿
场景:一份热点数据在缓存失效的瞬间,直接访问数据库,大量数据导致服务器崩溃
解决方案:
1.加互斥锁:一个线程访问时,其他线程必须等待,等该线程结束后,缓存会重建,其他线程继续访问。
2.设置永不过期:设置永不过期过或者逻辑上设置过期时间,该逻辑过期后,该线程立马重建缓存。
三.缓存雪崩
场景:因某些原因,redis不提供服务,所有请求直接访问持久层,导致持久层宕机
1.避免同时过期
设置过期时间时加一个随机数,保证他们不会同时过期
2.设置高可用的redis缓存
设置多个节点,一个宕机,其他的还能服务
3.设置多级缓存
增加本地缓存,在redis前面加一级缓存
4.设置限流和降级策略
对持久层进行限流操作,减少请求访问,对于未访问到的请求,返回一个默认值