缓存雪崩
多个key同时失效,导致多个请求直接打到数据库导致数据库宕机
原因:
-
缓存中间件服务不可用,缓存失效导致所有请求打到数据库
-
缓存中大量key同时过期
如何避免:
-
尽可能保证缓存中间件的高可用,比如redis缓存,那么就采用redis的cluster集群,已提前做好缓存组件报警机制,杜绝宕机
-
1.在失效时间上增加一道五分钟的随机值 ,对热数据进行访问的时候自动续期
缓存击穿
单个key失效,导致请求同一条数据的并发请求同时打到数据库,导致数据库宕机
如何避免:
-
设置热点数据永不过期
-
做好限流、熔断、降级防止系统崩溃
-
加锁
缓存穿透
缓存和数据库中数据都不存在,导致大量请求打到数据库
原因:
-
业务设计不合理
-
业务/运维/开发失误的操作,比如缓存和数据库的数据都被误删除了
-
黑客非法请求攻击,比如黑客故意捏造大量非法请求,以读取不存在的业务数据
如何避免:
-
api入口进行参数校验,过滤非法值
-
将空数据到缓存中,设置key-null,同时设置短的缓存时间(如30秒),这样可以放防止用户反复用一个id暴力攻击
-
采用布隆过滤器通过多次哈希将可能存在的数据映射到一个大数组,并将相应位置设为1。当检查请求数据经过相同的哈希计算后在数组中的位置时,如果位置为0,则数据一定不存在;如果为1,则数据可能存在,但有一定的误判可能性。