redis中RedissonLock如何实现等待锁

技术redis中RedissonLock如何实现等待锁今天就跟大家聊聊有关redis中RedissonLock如何实现等待锁,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有

今天我就来和大家聊聊如何实现redis中的等待锁。很多人可能不太了解。为了让大家更好的了解,边肖为大家总结了以下内容。希望你能从这篇文章中有所收获。

00-1010,总有一个需求,就是在一个查询界面中,第一次查询的时候,如果没有查询,就要执行初始化的方法,初始化的数据就会出来,然后数据库中的数据就可以被后续的查询直接查询了。这种设计的目的是,如果要初始化的数据太大,无法通过再次调用方法来处理,或者如果不是每一条数据都需要初始化,在这种情况下,首先要查询的数据将首先被初始化。

前言

这种方案会引起问题。众所周知,接口自然是幂等的,所以不需要做幂等处理。但是在方案中,这个查询不仅仅是一个查询。当找不到查询时,将执行初始化方法,这本质上是一个插入逻辑。这要求我们自己做幂等运算。

00-1010单服务,我们可以用Java锁实现幂等性,并且把每一条数据的主键id作为锁。但是现在基本上都是分布式服务。正如上一篇文章所说,我们可以用分布式锁RedissonLock来实现它们。

当与第一个请求并发时,竞争RedissonLock。得到锁的人将执行初始化方法。如果没有锁请求,您可以设置等待时间来等待锁被释放。解除锁定后,可以先检查数据是否已经初始化,完成后直接检查数据库。这里,我们来谈谈RedissonLock如何等待。

问题

redisonlock在加锁方法中提供了一个api,并提供了一个参数waitTime,即等待时间。

Publibooleantylock(长等待时间、长租用时间、时间单位)将在等待期间订阅消息。这里使用了redis本身的发布和订阅功能。

rfutureresolvenlockentrysubscribefuture=subscribe(threadId);

if(!subscribeFuture.await(时间,时间单位。毫秒)){ 0

if(!subscribe future . cancel(false)){ 0

subscribe future . on complete((RES,e)-{ 0

if(e==null){ 0

取消订阅(subscribeFuture,threadId);

}

});

}

acquire failed(threadId);

returnfalse

}这样,当锁被释放时,消息也同时被释放。所有监听锁的线程都会得到通知,然后这些线程会再次争夺锁,从而实现我们需要的幂等函数。我们在看开锁的逻辑。你发布消息了吗?

方案

protected futuredeborbonunlockinerasync(longthreadId){ 0

returncommandxecutor . evalwriteasync(getName()、LongCodec。实例,RedisCommands。EVAL_BOOLEAN

if(redis.call(‘hexists ‘,KEYS[1],ARGV[3])==0)然后

‘ returnnil’

‘ end’

local counter=redis . call(‘ hin crby ‘,KEYS[1],ARGV[3],-1);’

if(count 0)then’

redis . call(‘ PEX fire ‘,KEYS[1],ARgV[2]);

返回0;’

“否则”

redis.call(‘del ‘,KEYS[1]);

redis.call(‘publish ‘,KEYS[2],ARgV[1]);

‘ return1’

‘ end’

‘ returnnil’,

数组。ObjectasList(getName()、getChannelName())、LockPubSub。UNLOCK_MESSAGE,internalLockLeaseTime,getLockName(threadId));

}可以看到,在unlockInnerAsync方法中,执行的是lua脚本,在脚本中,我们很容易看到执行的是publish命令。

Redisson巧妙地利用Redis的发布订阅功能,实现分布式锁的等待功能。

看完以上内容,你对redis中如何实现等待锁有更好的理解吗?如果您想了解更多知识或相关内容,请关注行业资讯频道,感谢您的支持。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/84020.html

(0)

相关推荐

  • Hibernate查询语句有哪些

    技术Hibernate查询语句有哪些小编给大家分享一下Hibernate查询语句有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. se

    攻略 2021年12月8日
  • 杯弓蛇影的意思是,形容水中倒影的成语有哪些

    技术杯弓蛇影的意思是,形容水中倒影的成语有哪些水中倒影杯弓蛇影的意思是,并不是影子。影子是由于光的直线传播,当光线遇到不透明的物体时,在物体后面形成的黑暗区域。而水中倒影是光的反射现象,当物体射出的光线射到水面上时,被水

    生活 2021年10月27日
  • 桑蚕丝和真丝的区别,真丝与桑蚕丝的区别是什么

    技术桑蚕丝和真丝的区别,真丝与桑蚕丝的区别是什么要搞清楚真丝与桑蚕丝的区别,首先要知道什么是真丝,什么是桑蚕丝。桑蚕丝是一种人工养殖的以桑叶为食物的动物桑蚕所吐的丝纤维,主要成分是蛋白质,里面含有十八种对人体有益的氨基酸

    生活 2021年10月26日
  • PHP函数和魔术常量有哪些

    技术PHP函数和魔术常量有哪些这篇文章主要讲解了“PHP函数和魔术常量有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP函数和魔术常量有哪些”吧!PHP 函数PH

    攻略 2021年11月30日
  • 220v50hz一小时多少电,220v50HZ多大功率

    技术220v50hz一小时多少电,220v50HZ多大功率光看电压和频率是无法看出功率的220v50hz一小时多少电。电功率= 电压×电流。 220v50Hz是市电电压以及频率,功率的单位是瓦或者千瓦,功率=电压×电流,

    生活 2021年10月20日
  • 如何进行JSP的mysql_jdbc驱动程序的安装和使用

    技术如何进行JSP的mysql_jdbc驱动程序的安装和使用这篇文章给大家介绍如何进行JSP的mysql_jdbc驱动程序的安装和使用 ,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。小编只是简单描述

    攻略 2021年11月16日