【数据存储】【Redis】高并发下实现分布式锁

2021-08-08 22:31:04 来源:网络整理 作者:管理员

原标题:【数据存储】【Redis】高并发下实现分布式锁

【数据存储】【Redis】高并发下实现分布式锁

大部分互联网公司实现分布式锁原理

/**

* 分布式锁底层实现原理

* @return

*/

@GetMapping("distributedLock")

public Object distributedLock(){

String lockKey = "distributedLockKey";

//给每个线程都设置一个唯一标识,避免出现程序执行的时间超过设置的过期时间,导致其他线程删除了自己的锁

String clientId = UUID.randomUUID().toString();

try {

//添加过期时间保证线程运行到一半的时候,程序崩了,导致缓存中的key一直存在

Boolean result = redisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS);

if (!result) {

return "error_code";

}

// Todo 实现业务逻辑

redisTemplate.opsForValue().set(TestConstant.KEY_TEST,String.valueOf(System.currentTimeMillis()));

} finally {

//判断是不是自己的线程删除自己的锁

if (clientId.equals(redisTemplate.opsForValue().get(lockKey))) {

redisTemplate.delete(lockKey);

}

}

//Todo 当前代码未实现锁续命功能,锁续命功能:由于程序执行时间可能超过设置缓存中锁的过期时间,导致后续一部分业务未执行,一直被其他线程抢占,需要对锁进行续命,但是由于续命的时间不好确定,这个时候就需要单独开启子线程,定时任务不断的去判断当前锁,还在不在,如果不在了,说明业务已经执行完成了,如果还在,重新设置过期时间,一般而言,定时任务的时间为缓存设置的过期时间三分之一就可以了。

return "end";

}

/**

* 分布式锁底层实现原理

* @return

*/

@GetMapping("distributedLock")

public Object distributedLock(){

String lockKey = "distributedLockKey";

//给每个线程都设置一个唯一标识,避免出现程序执行的时间超过设置的过期时间,导致其他线程删除了自己的锁

String clientId = UUID.randomUUID().toString();

try {

//添加过期时间保证线程运行到一半的时候,程序崩了,导致缓存中的key一直存在

Boolean result = redisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS);

if (!result) {

return "error_code";

}

// Todo 实现业务逻辑

redisTemplate.opsForValue().set(TestConstant.KEY_TEST,String.valueOf(System.currentTimeMillis()));

} finally {

//判断是不是自己的线程删除自己的锁

if (clientId.equals(redisTemplate.opsForValue().get(lockKey))) {

redisTemplate.delete(lockKey);

}

}

//Todo 当前代码未实现锁续命功能,锁续命功能:由于程序执行时间可能超过设置缓存中锁的过期时间,导致后续一部分业务未执行,一直被其他线程抢占,需要对锁进行续命,但是由于续命的时间不好确定,这个时候就需要单独开启子线程,定时任务不断的去判断当前锁,还在不在,如果不在了,说明业务已经执行完成了,如果还在,重新设置过期时间,一般而言,定时任务的时间为缓存设置的过期时间三分之一就可以了。

return "end";

}

【数据存储】【Redis】高并发下实现分布式锁

基于redisson实现高并发分布式锁

引入依赖:

org.redisson

redisson

3.6.5

org.redisson

redisson

3.6.5

启动类中注入bean对象:

@Bean

public Redisson redisson() {

// 此为单机模式

Config config = new Config();

config.useSingleServer().setAddress("redis://localhost:6379").setDatabase(0);

return (Redisson) Redisson.create(config);

}

@Bean

public Redisson redisson() {

// 此为单机模式

Config config = new Config();

config.useSingleServer().setAddress("redis://localhost:6379").setDatabase(0);

return (Redisson) Redisson.create(config);

}

实现分布式:

@Autowired

RedisTemplate redisTemplate;

@Autowired

private Redisson redisson;

/**

* 基于redisson实现高并发分布式锁

* @return

*/

@GetMapping("highConcurrencyDistributedLock")

public Object highConcurrencyDistributedLock(){

RLock redissonLock = redisson.getLock(TestConstant.HIGH_CONCURRENCY_DISTRIBUTED_LOCK);

try {

//加锁,实现了key设置,过期时间,锁续命功能

redissonLock.lock(); //redisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS);

// Todo 实现业务逻辑

redisTemplate.opsForValue().set(TestConstant.KEY_TEST,String.valueOf(System.currentTimeMillis()));

} finally {

//释放锁

redissonLock.unlock();

}

return redisTemplate.opsForValue().get(TestConstant.KEY_TEST);

}

@Autowired

RedisTemplate redisTemplate;

@Autowired

private Redisson redisson;

/**

* 基于redisson实现高并发分布式锁

* @return

*/

@GetMapping("highConcurrencyDistributedLock")

public Object highConcurrencyDistributedLock(){

RLock redissonLock = redisson.getLock(TestConstant.HIGH_CONCURRENCY_DISTRIBUTED_LOCK);

try {

//加锁,实现了key设置,过期时间,锁续命功能

redissonLock.lock(); //redisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS);

// Todo 实现业务逻辑

redisTemplate.opsForValue().set(TestConstant.KEY_TEST,String.valueOf(System.currentTimeMillis()));

} finally {

//释放锁

redissonLock.unlock();

}

return redisTemplate.opsForValue().get(TestConstant.KEY_TEST);

}

显示全文
为您推荐
惊心动魄!ufo事件盘点,ufo造访地球的真实事件证据
惊心动魄!ufo事件盘点,ufo造访地球的真实事件证据

【导读】 惊心动魄!ufo事件盘点,ufo造访地球的真实事件证据,下面是小编为你收集整理的,希望对你有帮助!导语:一提起ufo,人们首先就会很兴奋,多少年来一直没有放弃过对ufo的探索与发现,世界各地也有很多关于ufo事件的目击消息,这些消息中有真有假,不过随着ufo事件报道每年都在增加,十分关注ufo的专......

发布时间:2023-10-22 12:01:08

洛阳桥位于哪里
洛阳桥位于哪里

【导读】 洛阳桥位于哪里,下面是小编为你收集整理的,希望对你有帮助!洛阳桥,曾用名“万安桥”,是中国福建省泉州市境内连接台商投资区和洛江区的一座桥梁。位于洛阳江水道之上,也是著名的跨海梁式大石桥,素有“海内第一桥”之誉,是古代“四大名桥”之一。宋庆历年间(1041年至......

发布时间:2023-10-22 11:01:07

即时通讯的意思是什么
即时通讯的意思是什么

【导读】 即时通讯的意思是什么,下面是小编为你收集整理的,希望对你有帮助!即时通讯是什么意思即时通讯(InstantMessaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷。服务提供商也提供了越来越丰富的通讯服务功能。因特网(Inte......

发布时间:2023-10-22 10:31:06

g242高铁途经哪些站点
g242高铁途经哪些站点

【导读】 g242高铁途经哪些站点,下面是小编为你收集整理的,希望对你有帮助!1、G242次列车是由厦门北开往青岛的高铁,列车全程:2043公里,运行时间:12小时41分钟。07:45分从厦门北始发,途径23个站,于20:26分到达终点站青岛站。2、途经站:厦门北、晋江、泉州、......

发布时间:2023-10-22 10:01:05

隋炀帝的功与过:功为千古一帝(过成祸国之君)
隋炀帝的功与过:功为千古一帝(过成祸国之君)

【导读】 隋炀帝的功与过:功为千古一帝(过成祸国之君),下面是小编为你收集整理的,希望对你有帮助!隋炀帝的功与过是很复杂的,可以肯定的是其是一位亡国之君,它使用卑鄙的手段获得了皇位,在上位初期他将所有的军事活动完成了统一,而且解决了扬州问题,在政治上他营建了东都洛阳,使得物资的运转更为方便,还继续......

发布时间:2023-10-22 09:01:05

九灵元圣和二郎神谁厉害?二郎神(有人类和仙人的血脉)
九灵元圣和二郎神谁厉害?二郎神(有人类和仙人的血脉)

【导读】 九灵元圣和二郎神谁厉害?二郎神(有人类和仙人的血脉),下面是小编为你收集整理的,希望对你有帮助!大家都知道孙悟空会七十二变,这已经非常厉害了,而二郎神则会七十三变,比孙悟空还厉害,所以二郎神擒住孙悟空是很轻松的,除了二郎神还有九灵元圣也是让孙悟空头疼。那二郎神和九灵元圣都能制服孙悟空,他们俩之间......

发布时间:2023-10-22 08:01:05

燃气和天然气的区别是什么
燃气和天然气的区别是什么

【导读】 燃气和天然气的区别是什么,下面是小编为你收集整理的,希望对你有帮助!天然气的压力是2800帕,管道煤气(燃气)的压力是2000帕。管道煤气灶可以改成天然气灶。把灶具的喷嘴和火盖更改一下即可。燃气的出气口很小,天然气的要稍大些,其中喷嘴就是在开关后面的出气喷嘴,在灶底下......

发布时间:2023-10-22 07:01:04

oppoa72电池多少毫安
oppoa72电池多少毫安

【导读】 oppoa72电池多少毫安,下面是小编为你收集整理的,希望对你有帮助!对于oppoa72电池多少毫安的这个问题,我们下面就来大概了解下。oppoa72电池容量为4040毫安。OPPOA72的正面采用了打孔屏,背部采用了左上角的浴霸三摄,采用侧边指纹解锁它采用6.5英寸的......

发布时间:2023-10-22 06:01:04

河童是什么生物,水神的使者/吃人的水虎怪(图片)
河童是什么生物,水神的使者/吃人的水虎怪(图片)

【导读】 河童是什么生物,水神的使者/吃人的水虎怪(图片),下面是小编为你收集整理的,希望对你有帮助!在我国和日本的民间有很多关于河童的传说,有人说它们是守护河流的河神,也有人说它们是狡猾嗜血的怪物。没有人具体知道河童是什么生物,也没有人拍摄到河童图片,它还有一个名称叫做水虎。日本会将河童当作神灵膜拜......

发布时间:2023-10-22 05:01:06

三星手机重置后如何恢复原来数据
三星手机重置后如何恢复原来数据

【导读】 三星手机重置后如何恢复原来数据,下面是小编为你收集整理的,希望对你有帮助!1、待完成三星手机恢复出厂设置操作后,重启手机,等出现“欢迎”界面后,选择“简体中文”,点击“下一步”按钮。2、接下来需要连接无线WiFi网络,用于实现手机数据的恢复操作。3、在“日期和时间”界面中,......

发布时间:2023-10-22 04:01:04

在郑州哪里看夜景最好
在郑州哪里看夜景最好

【导读】 在郑州哪里看夜景最好,下面是小编为你收集整理的,希望对你有帮助!1、郑州CBD的标志建筑物玉米楼,在深沉的夜晚,变换着彩色的光芒,这光芒既不是微光,也不刺眼,在夜空下,形成一道亮丽的风景线。大金蛋的质感和CBD的风采截然一体,它深沉的变换着霓虹灯,给夜晚增添色彩。......

发布时间:2023-10-22 03:37:00

主板诊断卡显示a2的意思是什么
主板诊断卡显示a2的意思是什么

【导读】 主板诊断卡显示a2的意思是什么,下面是小编为你收集整理的,希望对你有帮助!主板诊断卡显示a2是什么意思主板诊断卡显示A2的意思是:高速缓冲存储器测试结束,即将显示任何软错误。解决方法:检查键盘锁。其它相关代码的意思:A0:发出键盘识别命令,即将使键盘识别标志复原。解决方法:......

发布时间:2023-10-22 03:01:04