
课程咨询: 400-996-5531
投诉建议: 400-111-8989
认真做教育 专心促就业
缓存雪崩是大多数程序员在学习软件运维管理的时候会经常接触到的一个问题,而本文我们就通过案例分析来简单了解一下,缓存雪崩产生原因与解决方案。
缓存雪崩是指大量的请求无法在缓存中处理,从而将请求转移到数据库中,导致数据压力倍增。一个Redis实例可以支持万级别的并发请求,而单个数据库只能支持千级别的并发请求。两者处理请求并发能力相差十倍,数据库会由于压力过大而导致雪崩。
这里雪崩一般是由两个原因组成,很多文章只写缓存同时过期的情况。
原因一:缓存中大量的数据同时过期
一般设置缓存数据会设置缓存时间,在某一时刻,大量的缓存同时过期,此时如果有请求访问这些数据的话,缓存不存在,会将请求转移到数据库,如果这些的请求量比较大的,导致数据库的压力增大,严重会导致数据库崩溃。
针对大量缓存同时失效带来的雪崩,有两种解决方案。
方案一:过期时间设置随机值
应该避免给数据设置相同的过期时间,在设置过期时间时,增加一点随机值。
setRedis(key,value,time+Math.random()*10000);
方案二:服务降级
服务降低,比如使用hystrix,是指发生雪崩时,针对不同的数据采取不同的处理方式。
请求数据是非核心数据(比如商品属性),暂时停止从缓存查询数据,直接返回预定信息、空值或者错误值。
请求数据是核心数据(比如商品库存、价格),仍然查询缓存,如果缓存缺失,继续在数据库读取。
服务降级
原因二:redis服务挂了
redis服务发生宕机,无法处理请求,这就会导致全部转移到数据库去,发生雪崩。
方案一:添加服务熔断
服务熔断,就是发生雪崩时,暂停对缓存的访问。等redis服务恢复正常后,再允许访问缓存。
对redis所在的服务器进行指标监控,比如QPS、CPU使用率、内存使用率等,如果发现redis服务宕机,而数据库请求压力倍增,此时可以启动熔断机制,暂停对缓存和数据库的访问,比如使用Hystrix服务熔断。
但是暂停对缓存系统的访问,但是对整个业务系统影响很大,导致很多数据不能查看。为了减少这种影响还有另一个方案:请求限流。
方案二:请求限流
请求限流,就是限制前端请求每秒请求量,使得数据库能承受前端全部请求。
比如前端允许每秒访问1000次,其中900请求缓存,100次才请求数据库。
一旦发生雪崩,数据库每秒请求激增到1000次,此时启动请求限流,在前端入口只允许每秒请求100次,过多的请求直接拒绝。
请求限流
无论使用服务熔断或请求限流都是是发生雪崩后处理,这里还有事先预防的方案。
通过主从节点的方式构建redis集群,如果redis主节点宕机,从节点可以切换成主节点。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加抖音达内三江区域学习了解。