下馆子也能造成redis缓存雪崩?redis缓存击穿?

引言

朋友张三给我讲了一个故事,还给我简单谈了谈redis的常见面试问题以及解决思路。张三某日去一家闻名小镇的苍蝇馆子吃饭,碰巧今天小镇有活动,张三一行人见状抓紧前行...

击穿

来这家馆子吃饭的人数剧增,张三和其他饭友一样来到店里坐下,店家原本准备的土豆烧肥肠, 梅菜扣肉,凉拌三丝,黑豆花早就被一扫而空,张三和其他饭友都点了这几样菜,这时只有等待店家重新制作完成方能食用,这个现象是店家原本准备了这几样菜,但由于人数比往常剧增再加上需求都是这几样菜, 就造成了大量的食客等待,这一现象就像是数据库原本有某些key,前端访问这些缓存的key是没问题的,但突然或者某个时刻大量的key在缓存中失效了,同时有高并发的情况来访问这些key,在我们代码实现上就会去数据库查询keys并将其返回且放入缓存中, 那么在高并发情况同时多个请求去数据库定会对数据库造成压力,这一现象就可以理解为缓存击穿,总结一句话就是,击穿前提是一定有高并发,几千个几万个访问请求压过来且key过期了,直接去访问数据库了,对数据库造成了压力。

店家面对如此多的需求怎么解决,那么肯定需要排队点餐或者点餐有先后顺序,店家会一个订单接着一个订单的处理这么多食客的需求,至于厨房怎么加工,是多线程还是单线程这里不讨论,确定一点就是同一时间只处理一个,redis是单进程单实例,我们可以使用setnx() 对Key加锁,只有获得锁的线程才去访问数据库并将数据回写到缓存这样后期有其他线程来查询这个key就有缓存了,加锁也会存在锁过期而查询数据库还未返回,对于锁过期可以使用另外一个线程来监控当前线程是否取回数据,未取回就增加锁的过期时间。

雪崩

同样的情况下,我们把成品食材不足情况在恶化一下,店家由于未预料到今日食客的增加,原本准备的辣椒,土豆,食用油,Q弹肥肠,大蒜,香菜,梅菜,大片五花肉,莴笋,海带,胡萝卜等基础食材大量匮乏,食客又要在此店吃饭,那店家就只有去花时间及人力去购买这些基础食材, 这个现象是大量的食材在同一时刻匮乏,这个现象就像是在多个key在同一时刻(比如零点)发生过期,也可能是一个key有几十个访问过来加起来之后造成的对数据库的访问压力。

雪崩了怎么解决?

解决思路是先区分跟时点性有无关系,无关就用随机过期时间来解决,有关的话可以采取a:强依赖击穿的方案,就是和击穿处理方式一样,b:在业务层增加判断,零点延时这种,可能在延时的这1秒或者2秒后面就已经把数据取过来放在redis里了,这样都不用这些个请求压到数据库。

穿透

张三隔壁桌来了几个外地客,让店家做个大盘鸡和手抓排骨饭,店家可犯难了,一个川菜馆哪会做新疆菜,只好委婉让客人点店家能提供的菜品,这一现象是店家无法提供本就不会的菜品,这个现象就像是前端传给业务层一些个数据库本身就不存在的key,这就是穿透。

穿透了怎么解决?

解决思路是增加算法来控制key不走向数据库,可以自己在客户端实现过滤算法,也可用现成的过滤器比如布隆过滤器、布谷鸟过滤器。

总结

今天简单介绍了redis常见缓存面试的击穿、雪崩、穿透的现象和解决思路,我们下期再见!欢迎关注,发现更多精彩内容!

原文地址:https://cloud.tencent.com/developer/article/2121091

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340