您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

原来大厂的Redis分布式锁都是这样设计的! <网站源码>

  • 时间:2022-07-17 00:37 编辑: 来源: 阅读:328
  • 扫一扫,手机访问
摘要:原来大厂的Redis分布式锁都是这样设计的! <网站源码>
1常用本地锁,即JDK自带的锁,如synchronize或lock,只能锁定当前进程,只适用于单片架构服务。 但在分布式多服务实例场景下,需要使用分布式锁image2分布式锁2.1分布式锁原理。厕所占坑理论可以同时去一个地方“占坑”:如果被占,执行逻辑或者等到锁可以释放,“占坑”可以去Redis,DB,所有服务都可以访问的任何地方。 2.2分布式锁进化的第一阶段//占领分布式锁,移除redis占领坑布尔锁= redistemplate.ops for value()。setifabsent ("lock "," 111 ");If(lock) {//锁定成功...执行业务地图< String,List & ltCatelog2Vo & gt& gtdata fromdb = getDataFromDb();redisTemplate。delete(键:“锁”);//fhti返回数据romDb} else {//锁定失败,请重试 Synchronized() //休眠100ms后再试//Spin返回GetCatalogJSONFromdBWITHREDISLOCK();}镜像问题场景setnx占了坑,但是执行过程中业务代码异常或者程序宕机,即不执行成功删除锁的逻辑,导致死锁处理方案:设置锁自动过期,即使不删除也自动删除。 阶段2图像// 1。占领分布式锁,移除redis,占领坑。boolean lock = redis template . ops for value()。Setifabsent ("lock ")," 110")if(lock) {//锁定成功...业务执行//突然停电// 2。设置过期时间redistemplate.expire ("lock ",timeout: 30,time unit . seconds);地图& lt字符串,列表& ltCatelog2Vo & gt& gtdata fromdb = getDataFromDb();//删除锁redisTemplate。删除(键;“锁”);返回dataFromDb} else {//锁定失败...再试一次。 Synchronized () //休眠100ms重试//Spin方式返回getCatalogJSONF romdbwithRedisLock();}问题场景setnx设置完毕,即将设置到期时间、停机时间、死锁。解决方案:设置到期时间和占用必须是原子操作。 Redis支持使用setNxEx命令phase three image// 1。分布式锁坑布尔锁= redistemplate。价值运营()。Setifabsent ("lock "," 110 ",300,时间单位。秒);如果(锁定)(//锁定成功,执行业务// 2。设置到期时间,必须和lock//redisttemplate . expire(" lock ",з 0,timeunit.seconds)一起作为原子操作使用;地图& lt字符串,列表& ltCatelog2Vo & gt& gtdata fromdb = getDataFromDb();//删除锁redis template . Delete(key:“lock”)并从db返回数据;Else {// lock失败,重试//hibernate 100ms,重试//spin return getcatalogjsonfromdbithredislock()}阶段IV镜像已经得到了lockvalue,并且有UUID,但是现在已经过期了!其余的人得到了锁并设置了新的值,所以如果删除了其他人的锁!!也就是说,删除锁不是原子操作。 地图& lt字符串,列表& ltCatelog2Vo & gt& gtdata fromdb = getDataFromDb();string lock value = redis template . ops for value()。get(" lock ");If(uuid.equals(lockValue)) {//删除我自己的锁redis template . Delete(" lock ");}问题场景如果恰好是当前值,在锁即将被删除的时候,锁已经过期,别人已经成功设置了新值。 删除的是别人的锁。删除锁时,解决方案必须确保原子性。 使用redis+Lua脚本 第五阶段确保锁定/解锁都是原子操作image string script = " ifredis . call(' get ',keys [1]) = = argv [1]然后返回redis.call ('del ',keys [1])否则返回0 end ";保证锁定[占用+到期时间]和删除[判断+删除]的原子性。 其实更麻烦的是锁的自动续费。 所以不管是大厂还是中小公司,我们直接选择Redisson,它已经处理好了这些问题!不要重复造轮子,还要知道框架处理过哪些问题,这样我们遇到问题就能快速检查定位。 在下一篇文章中,我们将开始雷迪森对他是如何设法续锁的解释~


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【技术支持|常见问题】1556原创ng8文章搜索页面不齐(2024-05-01 14:43)
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)
【技术支持|常见问题】别告诉我你没看过邰方这两则有思想的创意广告! (2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部