我们现在来到Task类当中,这个方法就是V4了/*** Redisson分布式锁实现* @throws InterruptedException*/
//    @Scheduled(cron="0 */1 * * * ?")//每1分钟(每个1分钟的整数倍)public void closeOrderTaskV4() throws InterruptedException {RLock lock = redissonManager.getRedisson().getLock(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);boolean getLock = false;try {if(getLock = lock.tryLock(2,50, TimeUnit.SECONDS)){//trylock增加锁log.info("===获取{},ThreadName:{}",Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK,Thread.currentThread().getName());int hour = Integer.parseInt(PropertiesUtil.getProperty("close.order.task.time.hour","2"));iOrderService.closeOrder(hour);}else{log.info("===没有获得分布式锁:{}",Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);}}finally {if(!getLock){return;}log.info("===释放分布式锁:{}",Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);lock.unlock();}}V4我们就要用Redisson来搞定分布式锁,其实我们原生实现的单点登陆,使用Spring Session实现单点登陆,原先我们实现的分布式锁,然后使用Redisson分布式锁都是这么一个过程,先原生实现,然后调用框架实现,本身我们原生实现完之后,基础会更扎实,然后再学习一些简单的框架呢,也会更快,例如Spring Session侵入性会比较小,那在改造的时候呢,在单位推动这个框架也更容易一些,使用Redisson来实现这个分布式锁,首先要把之前声明的RedissonManager注入到我们这个类当中,@Autowiredprivate RedissonManager redissonManager;然后直接使用他,首先声明一个RLock,Redisson的一个lock,我们先获取到Redisson这个实例,我们点tryLock,tryLock是尝试获取锁,也就是我们原来V3讲的版本,这里面尝试获取锁,把这些都封装好了,第一个有参数可以添加等待时间,锁的自动解锁时间,还有时间的一个单位,首先waittime是什么,尝试获取锁的时候,我最多等待两秒,那多久释放呢,5秒释放,也就是说这个锁最多放5秒,然后最后写上单位,tryLock的返回值是一个布尔/*** Returns <code>true</code> as soon as the lock is acquired.* If the lock is currently held by another thread in this or any* other process in the distributed system this method keeps trying* to acquire the lock for up to <code>waitTime</code> before* giving up and returning <code>false</code>. If the lock is acquired,* it is held until <code>unlock</code> is invoked, or until <code>leaseTime</code>* have passed since the lock was granted - whichever comes first.** @param waitTime the maximum time to aquire the lock* @param leaseTime lease time* @param unit time unit* @return <code>true</code> if lock has been successfully acquired* @throws InterruptedException - if the thread is interrupted before or during this method.*/boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException;那返回值代表是否获取锁成功,我们在上面给一个默认值,getLock是否获取到锁,默认是false,然后这里面要做一个判断,那座判断的时候还要给他更新,获取锁并把返回值赋给getLock,如果为true的话就会进入到if里边,我们打印一个日志,Redisson获取分布式锁,线程的名字,锁的名字,然后还要获取我们的小时,这里面我们就不调用closeOrder了,我们把分布式锁都交给Redisson来管理了,所以我们这里封装的,包括时间的控制,我们都不需要操作了,我们只把这个时间拿过来,然后可以直接调用iOrderService.closeOrder(hour),那这个Catch是一个打断的Exception,那这个Catch我们也要打一个日志,Redisson锁获取异常,这里面需要注意一下,我们要把finally加上,提高一下我们的代码健壮性,如果getLock没有拿到的话,直接返回,所以我们在finally里面调用unlock来释放这个锁,也就是说,锁用完之后,finally是肯定要执行的,然后在这里面要释放这个锁了,然后打印一个日志,Redisson分布式锁释放锁,finally一定不要忘记加,提高了我们代码的一个健壮性,我在tryLock的时候只等一秒,没有的时候就走人了

Redisson分布式锁实战-1:构建分布式锁相关推荐

  1. 越过游戏服务器修改,“撬锁”实战:绕过云锁提权某游戏私服

    原标题:"撬锁"实战:绕过云锁提权某游戏私服 严正声明:本文仅限于技术讨论与分享,严禁用于非法途径. 前言 朋友给我了我一个游戏私服的shell,说是提权不下服务器,让我帮忙看看. ...

  2. java 单例 读写锁_终极锁实战:单JVM锁+分布式锁

    目录 1.前言 2.单JVM锁 3.分布式锁 4.总结 =========正文分割线================= 1.前言 锁就像一把钥匙,需要加锁的代码就像一个房间.出现互斥操作的典型场景:多 ...

  3. 分布式数据库实战第一节 分布式数据库的前世今生

    开篇词 吃透分布式数据库,提升职场竞争力 你好,我是高洪涛,前华为云技术专家.前当当网系统架构师和 Oracle DBA,也是 Apache ShardingSphere PMC 成员.作为创始团队核 ...

  4. 分布式场景实战第二节 分布式场景下es和mysql避坑指南

    03 Elasticearch 注意要点:这三点你不得不知 02 讲中我们提到 Elasticsearch 能在短时间内搜索.分析大量数据,并作为查询数据的存储系统.坦白地说,Elasticsearc ...

  5. 《Redis官方文档》用Redis构建分布式锁

    <Redis官方文档>用Redis构建分布式锁 用Redis构建分布式锁 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现 ...

  6. RedisSon高并发分布式锁实战RedisSon源码解读

    Redis高并发分布式锁实战 1.分布式场景下的synchronized失效的问题–用redis实现分布式锁 synchronized是通过monitor实现的jvm级别的锁,如果是分布式系统,跑在不 ...

  7. redisson分布式锁,实战

    目录 什么时候用分布式锁? 分布式锁入门 超时设置 释放了不是自己加的锁 正确设置锁超时 加解锁代码位置有讲究 实现可重入锁 Redis Hash 可重入锁 主从架构带来的问题 什么是 Redlock ...

  8. Redisson分布式锁实战-2:解决wait_time之坑

    我们一起来分析一下原因,我们获取锁之后,我们只打印了一个日志,然后从配置文件里面拿到一个hour,然后就结束了,结束之后就来到finally里边,而这个时间并没有执行SQL语句,所以他的时间会非常非常 ...

  9. 浅析redis与zookeeper构建分布式锁的异同

    作者:架构小菜 链接:https://www.jianshu.com/p/508620a76e00 进程请求分布式锁时一般包含三个阶段:1. 进程请求获取锁:2. 获取到锁的进程持有锁并执行业务逻辑: ...

  10. 《Redis官方文档》用Redis构建分布式锁(悲观锁)

    2019独角兽企业重金招聘Python工程师标准>>> **用Redis构建分布式锁 ** 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章 ...

最新文章

  1. 责任链模式 mashibing代码
  2. C#的简单不安全双向“混淆”
  3. 如何在cmd运行python文件夹_python怎么在cmd运行文件夹
  4. promise异步请求串行异步then并行异步all竞争异步race 传递参数resolve(then)reject(catch)
  5. webrtc iOS端编译
  6. 伦巴时间步的动作要领_军训动作要领已到,请签收
  7. linunx 定位最耗资源的进程
  8. android2.2 froyo竖屏显示
  9. opencv车牌分割_OpenVINO车牌识别网络详解
  10. 融跃品牌月:央视出手,各大卫视联合融跃助力金融学子成梦
  11. 从零开始学java系列第一季第一期:简单的了解java并安装jdk以及环境配置
  12. 《全面软件质量管理》核心观点摘录
  13. Stemming : one way to normalize 英文单词的标准化
  14. Java替换第一个和最后一个字符串
  15. CVPR'22 | 基于可形变关键点模型的图像驱动技术
  16. Zoommy for mac(图片素材搜索下载软件)
  17. linux基本概念知识整理
  18. 为什么Go语言在今天能如此火热?
  19. C#获取字符串的拼音和首字母
  20. 本想搞清楚ESM和CJS模块的互相转换问题,没想到写完我的问题更多了

热门文章

  1. 用二维数组实现矩阵转置
  2. CrtInvertedIdx
  3. JavaScript实现表单的分向提交
  4. java.io.CharConversionException isHexDigit JS转码问题
  5. Java基本类型与运算
  6. 网络编程7_ multiprocessing类-管道.数据共享, 信号量,事件,进程池
  7. SSH框架之SSH前言
  8. Android一个ListView列表之中插入两种不同的数据
  9. 陈皓谈程序员的升级:职业规划就像软件工程
  10. 前标识(NT AUTHORITY\NETWORK SERVICE)没有对 (转)