缓存雪崩的产生原因是Redis缓存在设置key的过期时间中,采用了大量相同的过期时间,导致缓存在某一个时刻同时失效,同时所有的请求全部转发到DB,DB瞬间压力过重雪崩。或者是Redis服务直接宕机,导致请求直接打入DB中。
缓存雪崩与缓存击穿的区别: 缓存雪崩是很多key同时过期,而击穿是某一个key缓存过期。
缓存雪崩的解决办法:
1.给不同的key的TTL增加随机值,使他们的过期时间随机。(在原有的时间上添加一个随机值,比如1-5分钟随机,这样可以让每一个缓存的过期时间重复率降低,就很难引发集体失效)
2.利用Redis集群来提高服务的可用性。(采用哨兵模式或者集群模式)
3.给缓存业务添加降级限流的策略。(可以使用Nginx或者spring cloud gateway微服务网关)
4.给业务添加多级缓存。(Guava或者Caffeine 通常caffeine的使用是将caffeine设为一级缓存,再将Redis作为二级缓存,来优化更新失效场景下大量查询数据库的问题)
缓存三兄弟的解决办法中,有一个相同点 就是降级限流策略,但是这个策略一般是作为保底来使用。