缓存雪崩:
数据未加载到缓存中,或者缓存在同一时间大面积失效,从而导致所有的请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。
一个简单的雪崩过程:
1.redis集群大面积故障
2.缓存失效,但依然大量请求访问缓存服务redis
3.redis大量失效后。大量请求转向数据库
4.数据库的调用量暴增,很快就宕机
5.由于大量的应用服务依赖数据库和redis的服务,这个时候很快就会演变成各服务器集群的雪崩,最后网站崩溃。
如何预防缓存雪崩:
1.缓存高可用
缓存层设计成高可用,防止缓存大面积故障。即使有个别节点,个别机器宕机,依然可以提供服务。
2.缓存降级
利用本地缓存对服务访问进行限流,资源隔离,降级也就是服务熔断,服务降级。当访问量剧增,服务出现问题依然保证服务还是可用的,系统可以暂时关闭一些其他访问量少的服务,来自动降级、
3.Redis备份和快速预热
1).redis数据备份和恢复
2).快速缓存预热
4.提前演练
最后在上线前测试一下及时发现问题。
缓存穿透:
缓存穿透是指查询一个不存在的数据,缓存redis中没有命中去数据库中查,数据库也没有命中,每次都访问这个不存在的数据就会造成缓存穿透。
解决思路:
直接设置一个默认的值在缓存中,这样就不会去数据库中了,设置一个过期时间。
可以增加一些判断,过滤掉不符合的查询。
缓存并发:
这里的并发是指多个redis的client同时set key引起的并发问题。其实redis自身是单线程,多个client并发操作就会先到先执行其余的阻塞。
解决方案:
把redis.set的操作放在队列里执行使其串行化,必须一个一个执行。
缓存预热:
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统这样就可以避免用户在请求的时候先查询数据库然后再将数据缓存的问题。用户直接查询事先被预热的缓存数据。
解决思路:
1.直接写一个缓存刷新页面,上线时手工操作下。
2.数据量不大,可以在项目启动的时候自动进行加载。目的就是在系统上线前,将数据加载到缓存中。