大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
怎么发生的?
雪崩概念:在某一个时间段,缓存集中过期失效。
举例说明:
如果所有首页的Key失效时间都是12小时,中午12点刷新的,我零点有个秒杀活动大量用户涌入,假设当时每秒 6000 个请求,本来缓存在可以扛住每秒 5000 个请求,但是缓存当时所有的Key都失效了。此时 1 秒 6000 个请求全部落数据库,数据库必然扛不住,它会报一下警,真实情况可能DBA都没反应过来就直接挂了。此时,如果没用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。这就是我理解的缓存雪崩。
同一时间大面积失效,那一瞬间Redis跟没有一样,那这个数量级别的请求直接打到数据库几乎是灾难性的,如果打挂的是一个用户服务的库,那其他依赖他的库所有的接口几乎都会报错,如果没做熔断等策略基本上就是瞬间挂一片的节奏,怎么重启用户都会把你打挂,等你能重启的时候,用户早就睡觉去了,并且对产品失去了信心,什么垃圾产品。
如何去处理?
这边推荐两种方案:
第一种缓存过期时间加入随机值
设置缓存过期时间时加上一个随机值,避免缓存在同一时间过期。
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379, 60);
//设置过期时间加上一个随机值
$redis->set('goods1', '商品', 60 + mt_rand(1, 60));
$redis->set('goods2', '商品', 60 + mt_rand(1, 60));
第二种双重缓存
设置两个缓存,原始缓存和备用缓存,原始缓存失效时,访问备用缓存,备用缓存失效时间设置长点。
//原始缓存
$redis->set('goods1', '商品', 60);
//设置备用缓存,失效时间设置长点
$redis->set('goods_beifen', '商品', 1800);
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/193804.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...