让你深刻理解缓存击穿和分布式锁!

本文通过高启强和唐小虎的故事,解释了缓存击穿的概念——当某个key过期,高并发请求直接导致数据库压力增大。同时,介绍了分布式锁如何缓解这个问题,比如使用setnx操作,设置超时时间避免死锁,但仍有数据库阻塞的风险。最后提出解决方案,即在设置超时时间的基础上,结合多线程判断操作状态来动态调整锁的超时时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文采用故事映射技术方式带你理解缓存击穿产生的原因,分布式锁的作用,以及击穿的解决。建议浏览路线:浅读下面技术部分——回头映射故事——思考

故事人物:
高启强(DB数据库) — 在京海鱼摊,每天从老默那里收鱼处理好发往全国各地的仓库;


唐小虎(redis集群)— 掌管高启强在全国各地的仓库,每个仓库都有100条库存;


买鱼的客户(高并发请求);

缓存击穿:
平时每天生意很好,突然有一天,食品安全部门检查说其中有一种鱼核酸检测不合格不能卖了,但是客户订单还在不断的下(key突然过期,高并发打过来)
唐小虎说:强哥,仓库那批鱼不合格清理掉了,刚一分钟内手机来了20条短信,沈阳的,吉林的河南的,广西的,一家10条鱼,一共2000条,你快把鱼发过来吧。强哥说:我正忙着刮鳞呢,一下搞这么多你要累死我(缓存击穿产生:大量请求直接打到数据库,造成数据库压力骤升)

分布式锁:
唐小虎:强哥怎么办?
高启强:发个短信你就接单了?你告诉客户,想订鱼,别直接发短信,叫他们打电话给你,拿小本记着什么鱼卖出去多少条,他们打电话如果忙线就让他们等着待会儿再打,如果发现哪种鱼卖没了,你就告诉下一个打电话买鱼的这鱼卖没了,别接单,听到没,要不累死我(电话占线:分布式锁setnx  key为‘黄花鱼10条’,小本本:监控器)

给分布式锁设置超时时间放死锁:
唐小虎手机卡了,不能挂对方电话,对方感觉先挂电话不礼貌,结果谁也没挂,其他客户谁也打不进来,后来小虎没办法,告诉所有客户:我手机不好使,我十秒钟不说话你们就挂(设置超时时间10s:解决死锁问题)

设置超时时间的分布式锁下依旧可能存在的问题:响应发生延时
唐小虎:wai? 强哥,我刚电话里答应了河南的客户10条黄花鱼,你那边做好了吗,强哥?喂?旁白:强哥忙于卖鱼,手机掉水里主板烧了,强哥没说话小虎也不敢和下一个客户说黄花鱼还有,就等强哥回信儿,客户等半天挂电话了,下一个打过来等半天也挂了,又下一个客户,客户催小虎,小虎催强哥……(数据库阻塞了,redis没法更新key,锁超时释放,下一个请求获取到锁,又去请求数据库)

最终方案:分布式锁设置超时时间+1号线程操作数据库+2号线程判断如为操作失败则延长锁的超时时间
唐小虎:强哥你也不接电话,我跟他们说两分钟不说话就挂电话,现在隔两分钟就有来电,我这电话打爆了(数据库操作发生阻塞,每隔一个超时时间就有请求打到数据库)
高启强:我有时候忙,接不到电话,你每次汇报,除了你给我电话说情况,你让你老婆也给我发个短信问问我处理好没,我如果没回你老婆信息,你就别让他们挂电话,免得其他人打进来(追加一个线程:判断数据库操作成功情况,如果没成功,延长过期时间,防止下一个请求获取到锁)

技术角度:(个人笔记)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yikexiaolizi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值