本文采用故事映射技术方式带你理解缓存击穿产生的原因,分布式锁的作用,以及击穿的解决。建议浏览路线:浅读下面技术部分——回头映射故事——思考
故事人物:
高启强(DB数据库) — 在京海鱼摊,每天从老默那里收鱼处理好发往全国各地的仓库;
唐小虎(redis集群)— 掌管高启强在全国各地的仓库,每个仓库都有100条库存;
买鱼的客户(高并发请求);
缓存击穿:
平时每天生意很好,突然有一天,食品安全部门检查说其中有一种鱼核酸检测不合格不能卖了,但是客户订单还在不断的下(key突然过期,高并发打过来)
唐小虎说:强哥,仓库那批鱼不合格清理掉了,刚一分钟内手机来了20条短信,沈阳的,吉林的河南的,广西的,一家10条鱼,一共2000条,你快把鱼发过来吧。强哥说:我正忙着刮鳞呢,一下搞这么多你要累死我(缓存击穿产生:大量请求直接打到数据库,造成数据库压力骤升)
分布式锁:
唐小虎:强哥怎么办?
高启强:发个短信你就接单了?你告诉客户,想订鱼,别直接发短信,叫他们打电话给你,拿小本记着什么鱼卖出去多少条,他们打电话如果忙线就让他们等着待会儿再打,如果发现哪种鱼卖没了,你就告诉下一个打电话买鱼的这鱼卖没了,别接单,听到没,要不累死我(电话占线:分布式锁setnx key为‘黄花鱼10条’,小本本:监控器)
给分布式锁设置超时时间放死锁:
唐小虎手机卡了,不能挂对方电话,对方感觉先挂电话不礼貌,结果谁也没挂,其他客户谁也打不进来,后来小虎没办法,告诉所有客户:我手机不好使,我十秒钟不说话你们就挂(设置超时时间10s:解决死锁问题)
设置超时时间的分布式锁下依旧可能存在的问题:响应发生延时
唐小虎:wai? 强哥,我刚电话里答应了河南的客户10条黄花鱼,你那边做好了吗,强哥?喂?旁白:强哥忙于卖鱼,手机掉水里主板烧了,强哥没说话小虎也不敢和下一个客户说黄花鱼还有,就等强哥回信儿,客户等半天挂电话了,下一个打过来等半天也挂了,又下一个客户,客户催小虎,小虎催强哥……(数据库阻塞了,redis没法更新key,锁超时释放,下一个请求获取到锁,又去请求数据库)
最终方案:分布式锁设置超时时间+1号线程操作数据库+2号线程判断如为操作失败则延长锁的超时时间
唐小虎:强哥你也不接电话,我跟他们说两分钟不说话就挂电话,现在隔两分钟就有来电,我这电话打爆了(数据库操作发生阻塞,每隔一个超时时间就有请求打到数据库)
高启强:我有时候忙,接不到电话,你每次汇报,除了你给我电话说情况,你让你老婆也给我发个短信问问我处理好没,我如果没回你老婆信息,你就别让他们挂电话,免得其他人打进来(追加一个线程:判断数据库操作成功情况,如果没成功,延长过期时间,防止下一个请求获取到锁)
技术角度:(个人笔记)