缓存雪崩
数据未加载到缓存中,或者同一时间大面积的缓存失效,导致所有请求全部查数据库,导致数据库cpu、内存负载过高或者直接宕机。
简单的雪崩过程:
1.redis集群大面积故障
2.缓存失效,依然有大量请求访问redis
3.redis大量失效后,大量请求直接转向到数据库
4.数据库的调用量暴增,很快就扛不住,甚至直接宕机
5由于大量的应用服务依赖redis和数据库的服务,这个时候就会演变成各个服务器集群雪崩,最后网站彻底崩溃。
如何预防缓存雪崩
1.缓存的高可用
缓存层设计城高可用,防止缓存大面积故障。即使个别节点、机器、甚至是机房宕机,依然可以提供服务,例如Redis Sentinel 和 Redis Cluster都实现了高可用。
2.缓存降级
可以利用ehcache等本地缓存暂时支持,但主要还是对源服务访问进行限流,资源隔离(熔断)、降级等。
当访问量剧增、服务出现问题任然需要需要保证服务器还是可用的,系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。
降级的最终目的还是保障核心服务高可用,即使是有损的。
比如推荐服务中,很多都是个性化的需求,如果个性化需求不能保证服务,那么可以降级补充点热点数据,不至于造成前端页面大片空白。
在进行降级钱要对系统进行梳理,比如:那些是核心的服务必须要保障,那些业务允许暂时的不提供服务,就可以利用静态页面暂时替换。以及配合服务器核心指标,然后设置整体预案。
1.一般:一些服务因为网络抖动或者服务正在上线而超时,可以自动降级
2.警告:有些服务在一段时间内成功率有波动(95%-100%),可以自动降级或人工降级,并发送警告
3.错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然增加到系统能承受的最大阀值,此时可根据情况自动降级或者人工降级。
Redis快速备份和预热
1.Redis数据备份和恢复
2.快速缓存预热
提前预练
项目上线前,提前演练缓存层宕掉后,应用以及后端的负载情况,以及可能出现的问题。对高可用提前演练,提前发现问题。
缓存穿透
缓存穿透是指查询一个不存在的数据,在Redis中没有命中,就需要从数据库中查询,查不到的数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库中查询,造成缓存穿透。
解决思路:
如果查询数据库也为空,直接设置一个默认值存放到缓存中,这样第二次到缓存中获取就有值了,而不会继续访问数据库,设置一个过期时间或者当有值的时候将缓存中的值替换掉即可。
可以给key设置一些格式规则,然后查询前先过滤掉不符合规则的key
缓存并发
这里的并发指的是多个client端同时set key 引起的并发问题,其实redis自身就是单线程操作,多个client并发操作,按照先到先执行的原则,先到的先执行,其余的阻塞。另外的解决方案是把redis的set操作放到队列中使其串行化,必须一个一个执行。
缓存预热
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统,这样就可以避免在系统用户请求时,先查询数据库,然后再将数据缓存的问题,用户直接查询事先被缓存的数据。
1.直接写个缓存刷新页面,上线时手工刷新一下
2数据量不大可以在项目启动的时候自动进行加载