分布式红锁的waitTime的设计原理

提前做2个动作:
1.先把3台 redis key全部清空
127.0.0.1:6379> flushdb
OK

2.isLock = redLock.tryLock(1000520, 1000605*20, TimeUnit.MILLISECONDS);

    @Overridepublic boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException {
//        try {
//            return tryLockAsync(waitTime, leaseTime, unit).get();
//        } catch (ExecutionException e) {
//            throw new IllegalStateException(e);
//        }long newLeaseTime = -1;if (leaseTime != -1) {if (waitTime == -1) {newLeaseTime = unit.toMillis(leaseTime);} else {newLeaseTime = unit.toMillis(waitTime)*2;}}long time = System.currentTimeMillis();//做debug的时候,一定要注意这个剩余时间,意思就是锁的等待时间,一旦剩余时间为0,获得锁就会失败。long remainTime = -1;if (waitTime != -1) {remainTime = unit.toMillis(waitTime);}long lockWaitTime = calcLockWaitTime(remainTime);int failedLocksLimit = failedLocksLimit();List<RLock> acquiredLocks = new ArrayList<>(locks.size());for (ListIterator<RLock> iterator = locks.listIterator(); iterator.hasNext();) {RLock lock = iterator.next();boolean lockAcquired;try {if (waitTime == -1 && leaseTime == -1) {lockAcquired = lock.tryLock();} else {long awaitTime = Math.min(lockWaitTime, remainTime);lockAcquired = lock.tryLock(awaitTime, newLeaseTime, TimeUnit.MILLISECONDS);}} catch (RedisResponseTimeoutException e) {unlockInner(Arrays.asList(lock));lockAcquired = false;} catch (Exception e) {lockAcquired = false;}if (lockAcquired) {acquiredLocks.add(lock);} else {if (locks.size() - acquiredLocks.size() == failedLocksLimit()) {break;}if (failedLocksLimit == 0) {unlockInner(acquiredLocks);if (waitTime == -1) {return false;}failedLocksLimit = failedLocksLimit();acquiredLocks.clear();// reset iteratorwhile (iterator.hasPrevious()) {iterator.previous();}} else {failedLocksLimit--;}}//剩余时间的计算if (remainTime != -1) {//当前时间减去上次的时间。remainTime -= System.currentTimeMillis() - time;time = System.currentTimeMillis();//如果剩余时间小于0,解锁退出if (remainTime <= 0) {//解锁,只要超时,任何业务都回滚。unlockInner(acquiredLocks);return false;}}}if (leaseTime != -1) {List<RFuture<Boolean>> futures = new ArrayList<>(acquiredLocks.size());for (RLock rLock : acquiredLocks) {RFuture<Boolean> future = ((RedissonLock) rLock).expireAsync(unit.toMillis(leaseTime), TimeUnit.MILLISECONDS);futures.add(future);}for (RFuture<Boolean> rFuture : futures) {rFuture.syncUninterruptibly();}}return true;}

总结:
waittime锁的等待时间处理,整个加锁的过程中,采用了系统的当前时间做减法计算。
即,每次for循环都减去每次循环的耗时,一旦时间小于等于0,就返回false,体现了代码的严谨性。
如果你今后设计一个超时代码,就可以参考今天这堂课的讲解原理。

分布式红锁的waitTime的设计原理相关推荐

  1. 分布式红锁的leaseTime的设计原理

    3.分布式红锁的leaseTime的设计原理 提前做2个动作: 1.先把3台 redis key全部清空(为了不受debug干扰,必须先删除锁) 127.0.0.1:6379> flushdb ...

  2. 分布式红锁的加锁失败的设计原理

    分布式红锁的加锁失败的设计原理 1.先把3台 redis key全部清空(为了不受debug干扰,必须先删除锁) 127.0.0.1:6379> flushdb OK 都设置为30分钟超时 过期 ...

  3. 分布式红锁的加锁的lua底层设计原理

    分布式红锁的加锁的lua底层设计原理 提前做2个动作: 1.先把3台 redis key全部清空(为了不受debug干扰,必须先删除锁) 127.0.0.1:6379> flushdb OK 2 ...

  4. 采用docker部署3台Redis分布式红锁实例

    采用docker部署3台Redis分布式红锁实例 docker run -p 6381:6379 --name redis-master-1 -d redis:5.0.7 docker run -p ...

  5. quartz 分布式_后端必备分布式技术之-调度系统Quartz设计原理

    调度系统作为分布式系统技术中重要的一环,了解其技术原理必不可少,不同系统内部采用的调度系统叫法不一样,但大致功能都类似,而Quartz作为经典的开源企业级调度系统,怎么能不研究一下呢? 为什么要学习q ...

  6. 华为18级大牛倾情奉送:分布式服务框架和微服务设计原理实战文档,啃完发现涨薪如此简单

    前言 分布式服务框架不仅仅包含核心的运行时类库,还包括服务划分原则.服务化最佳实践.服务治理.服务监控.服务开发框架等,它是一套完整的解决方案,用来协助应用做服务化改造,以及指导用户如何构建适合自己业 ...

  7. 【niubi-job——一个分布式的任务调度框架】----框架设计原理以及实现

    来自: http://www.cnblogs.com/zuoxiaolong/p/niubi-job-3.html 引言 niubi-job的框架设计是非常简单实用的一套设计,去掉了很多其它调度框架中 ...

  8. Redis核心数据结构List应用场景-商品列表、缓存击穿、PV阅读量、抢红包、推送帖子、普通分布式锁、Redis可重入锁与红锁

    List应用场景 Redis之List 一. Redis list命令实战 二.商品列表 高并发的淘宝聚划算实现技术方案 SpringBoot+Redis实现商品列表功能 二.缓存击穿 什么是缓存击穿 ...

  9. 分布式事务架构设计原理

    随着业务需求的复杂化,企业应用规模不断扩大,在后端开发中经常会遇到以下问题: 业务的并发要求非常高,对应的业务需要通过微服务拆分,甚至分库分表等架构设计才能满足并发需求,此时业务操作无法在同一个数据库 ...

最新文章

  1. Python实例浅谈之五Python守护进程和脚本单例运行
  2. git 如何正确的提交文件
  3. python3默认的代码编码是什么-Python3 到底什么是字符编码
  4. python tkinter库函数详解_Python使用tkinter库进行GUI编程中常用事件处理方式汇总
  5. Oracle Net
  6. java初级面试总结
  7. 如何用VNC远程管理Linux桌面
  8. 差别-request.getParameterValues与request.getParameter
  9. Take me to your heart 《吻别》英文版 已配了歌词
  10. 关于destoon系统遇到的一些问题总结
  11. 安卓MediaCodec编码aac
  12. 只是想要自己喜欢的生活,可是你有资格么?
  13. python如何采集同花顺股票日度历史数据
  14. u盘格式化了怎么恢复数据
  15. 阴阳师自动御魂觉醒超鬼王脚本
  16. web前端三大核心技术
  17. html5 端午节 龙舟,端午节赛龙舟的作文(精选10篇)
  18. 微信小程序——wxs脚本
  19. 项目管理 - PM、 SRS、SOW简介及范例
  20. 优化MATLAB中quiver函数绘制箭头图或矢量图(1)-MATLAB开发

热门文章

  1. Confluence 6 修改日志文件的大小数量和级别
  2. Android开发技巧——PagerAdapter再简单的包
  3. java 读取excel 文件 Unable to recognize OLE stream 错误
  4. 限制UITextView中的字数
  5. 哲学经典名句[zt]
  6. Linux 命令(20)—— cat 命令
  7. 腾讯实习mini项目总结
  8. oracle简单建库基本流程
  9. logstash增量同步mysql数据到es
  10. Specify 的含义 ------ 转载