Redisson分布式锁使用

news/2024/10/25 17:19:06/

一、使用 RedisTemplate 操作分布式锁

原子加锁(uuid Value+过期时间)+原子解锁(lua脚本)+加长过期时间

  • UUID :让锁区分,防止错删其他锁
  • 设置锁过期时间:当业务异常导致无法释放锁形成锁死,设置过期时间自动释放锁
  • Lua脚本:能够保证删除操作的原子性
  • 加长过期时间:过期时间必须大于业务执行时间
	1.加锁 (set key)try{2.业务:向redis缓存存入数据(1)查redis缓存数据,缓存有直接返回,(2)缓存没查到直接查数据库,(3)在锁释放之前 放入redis缓存}catch{处理异常}finally{3.释放锁 (delete key)}
public Map<String, List<CategoryLevel2Vo>> getCatelogJsonFromDataWithRedisLock() {//set NX key不存在才能set//设置set lock hah EX 300 NX,设置过期时间EX,防止死锁,加锁跟设置过期时间必须是原子性操作String uuid = UUID.randomUUID().toString();Boolean lock = stringRedisTemplate.opsForValue().setIfAbsent("lock", uuid,300,TimeUnit.SECONDS);//lock为true set成功if (lock){System.out.println("获取分布式锁成功");//加锁成功Map<String, List<CategoryLevel2Vo>> dataFromDb;try {dataFromDb = getDataFromDb();} finally {//释放锁(删除lock)//使用lua删除锁脚本,或者值+比较值+删除锁(脚本可以保证原子性)String redisScript = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then return redis.call(\"del\",KEYS[1]) else return 0 end";Long execute = stringRedisTemplate.execute(new DefaultRedisScript<Long>(redisScript, Long.class), Arrays.asList("lock"), uuid);}return dataFromDb;}else {//加锁失败System.out.println("获取分布式锁失败,等待重试");//休眠try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}//自旋return getCatelogJsonFromDataWithRedisLock();}

二、Lock锁

Lock锁与RedisTemplate 操作分布式锁区别,为什么Lock锁不用循环判断是否拿到锁?

  • 自动续期,lock.lock()加锁时,看门狗LockWatchdogTimeout定时更新过期时间
  • 防止死锁,当业务异常导致无法释放锁,看门狗默认30s释放锁
1.加锁 lock.lock() 或 lock.lock(10, TimeUnit.SECONDS);
try{2.业务...
}catch{处理异常
}finally{3.释放锁 lock.unlock();
}

1.lock.lock(); 有续期
如果业务未完成,则锁自动续期,看门狗LockWatchdogTimeout默认时间30s,续期按
如果业务完成,则不会续期,如果不手动释放锁,默认30s后释放
如果占锁,则开启定时任务,重新设置过期时间(LockWatchdogTimeout),定时任务:使用掉三分之一的LockWatchdogTimeout就恢复成 30s

2.lock.lock(10, TimeUnit.SECONDS); 无续期,推荐使用
注意:设置锁时间必须大于业务执行时间,否则业务结束之前释放锁会被其他线程占锁,当业务结束释放时,删除了其他线程的锁
没有看门狗LockWatchdogTimeout
锁时间结束不会自动续期,设置锁时间大于业务执行时间

占锁成功,如果出现事故导致无法释放锁,在不抛出异常的情况下,会默认30s后释放锁,所以不会存在死锁的问题
在这里插入图片描述

@ResponseBody@GetMapping("/testRedisson")public String testRedisson(){RLock lock = redissonClient.getLock("my-lock");//加锁lock.lock();try {System.out.println("加锁成功:" + Thread.currentThread().getId());Thread.sleep(30000);} catch (InterruptedException e) {} finally {//释放锁System.out.println("锁释放:" + Thread.currentThread().getId());lock.unlock();}return "hello redisson";}

http://www.ppmy.cn/news/217631.html

相关文章

现在还有小型计算机吗,电脑诞生到现在小型化始终是趋势_笔记本-中关村在线...

小型化始终是PC行业发展的主线&#xff0c;无论是模具、材料的变化&#xff0c;还是芯片工艺制程、架构的变化&#xff0c;最终目的都是为了使电脑变得更小巧、更便携。 在小型化的趋势的前提下&#xff0c;硬件性能的不断攀升对于普通大众用户而言才能算得上是有意义。否则&am…

软件性能测试 硬件配置,硬件配置及性能测试_笔记本评测-中关村在线

本次收到的战神G8升级版配备了第六代智能英特尔(R)酷睿(TM)i7 6700HQ四核处理器&#xff0c;并安装有两条8GB DDR4 2133内存组成16GB容量&#xff0c;硬盘方面该机配备512GB SSD固态硬盘&#xff0c;显卡方面则是采用最新NVIDIA GeForce GTX 980M独立显卡以及核芯显卡HD 530的组…

中关村 :“迷你本”探秘

12月16日上午&#xff0c;我去北京中关村IT贸易中心区寻觅“迷你本”和MID的踪影&#xff0c;有所发现。所谓“迷你本”是指“Mini-Note PC”&#xff08;这是正规名称&#xff0c;也叫“Netbook”&#xff0c;即“上网本”&#xff09;的爱称&#xff08;pet name&#xff09;…

老人台式计算机,老年人对电脑的真正需求是什么?_笔记本电脑_笔记本新闻-中关村在线...

一体机老年人需求或不同 既然想要抓住老年人用户的心&#xff0c;必然先要了解老年人的需求。现在电脑产品的生产研发基本针对的都是以年轻人为主的广泛用户&#xff0c;虽然适应范围广、研发成本低&#xff0c;但是“大锅饭”怎么能合每个人的“胃口”&#xff0c;所以市场细分…

指纹识别键盘软件测试,防水键盘指纹识别_笔记本评测-中关村在线

屏幕方面&#xff0c;该机搭载了一块12.5英寸的雾面高清屏幕,分辨率为1366768&#xff0c;虽不是全高清但在12寸的机器上完全能够接受。通过软件Spyder5测试可以看出&#xff0c;该屏幕色域达到了61%的sRGB、45%的NTSC&#xff0c;整体色彩漂移处在可接受的范围内&#xff0c;应…

7代服务器cpu型号,七代酷睿都有哪些型号?_笔记本新闻-中关村在线

虽然市场战略从两步走升级到三步走,产品命名也进行了相应改动,但七代酷睿依然延续着英特尔的产品规律,比如桌面版本的Kabe Lake-S系列,移动版本的Kabe Lake-H系列、Kabe Lake-U系列和Kabe Lake-Y系列。 Kabe Lake-Y系列:主要用在2合1设备上 Kabe Lake-U系列:主要用在轻薄…

android 联想,民间高手让联想Yoga变安卓平板_联想笔记本电脑_笔记本新闻-中关村在线...

高手在民间 联想Yoga“一秒”变安卓平板 联想Yoga凭借着独特360度的翻转屏幕实现了笔记本与平板电脑的完美融合&#xff0c;也成为目前变形超极本中人气最高的产品。不过联想Yoga的两种形态都是在Windows 8操作系统下实现的&#xff0c;能不能让一台Yoga拥有双系统实现真正的“…

linux系统的笔记本,Linux:开源的免费操作系统_笔记本电脑_笔记本评测-中关村在线...

■linux Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件&#xff0c;Android系统就是基于Linux而开发出来的。 Linu…