1.缓存穿透
概念
大量请求访问没有缓存的key,指查询一个一定不存在的数据,由于缓存不命中,请求会穿透到数据库,导致数据库压力过大。
原因及解决办法
1.恶意攻击
解决办法:
- 对于少量请求的IP,限制其访问次数或者拉入黑名单;
- 程序去检查key的合法性,对于不合法的key,做过滤处理;
- 布隆过滤器
2.业务刚上线
解决办法:
- 预热Redis;
- 在最前端流量控制,逐步把请求释放出来;
- 设置空值key
2.缓存雪崩
概念
指大量的key在同一时间失效,导致请求全部落到数据库上,压力过大,进而影响到上下文的应用服务。缓存雪崩的原因可能是缓存服务器宕机、缓存设置了相同的过期时间等。解决办法可以采用分布式锁、异步加载缓存等方式,避免大量的key同时失效。
原因及解决办法
1.Redis故障
Redis缓存服务器宕机。
解决办法:
- 使用主从复制,提高可靠性;
- 故障时,采取服务降级、熔断、限流等措施
2.大量的key设置了相同的过期时间
解决办法:
- 将过期时间打散,加上随机值,尽量让缓存均匀过期;
3.缓存击穿
概念
指一个key非常热点,在不停的扛着大并发,当这个key在失效的瞬间,持续的大并发就穿破缓存直接请求数据库,导致数据库压力过大。缓存击穿的原因可能是热点数据没有被正确预热、缓存设置了较短的过期时间等。解决办法可以采用预加载、设置永久缓存等方式,避免热点数据失效。同时可以考虑使用互斥锁避免并发问题。
原因及解决办法
1.热点key设置了太短的过期时间
解决办法:
- 热点key设置较长的过期时间,对于非常重要的key,可以设置永久有效,但是要从业务角度考虑维护数据一致性;
- 使用分布式锁,如果key失效了,只保证一个请求访问数据库,然后更新key