分布式红锁的waitTime的设计原理
分布式红锁的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的设计原理相关推荐
- 分布式红锁的leaseTime的设计原理
3.分布式红锁的leaseTime的设计原理 提前做2个动作: 1.先把3台 redis key全部清空(为了不受debug干扰,必须先删除锁) 127.0.0.1:6379> flushdb ...
- 分布式红锁的加锁失败的设计原理
分布式红锁的加锁失败的设计原理 1.先把3台 redis key全部清空(为了不受debug干扰,必须先删除锁) 127.0.0.1:6379> flushdb OK 都设置为30分钟超时 过期 ...
- 分布式红锁的加锁的lua底层设计原理
分布式红锁的加锁的lua底层设计原理 提前做2个动作: 1.先把3台 redis key全部清空(为了不受debug干扰,必须先删除锁) 127.0.0.1:6379> flushdb OK 2 ...
- 采用docker部署3台Redis分布式红锁实例
采用docker部署3台Redis分布式红锁实例 docker run -p 6381:6379 --name redis-master-1 -d redis:5.0.7 docker run -p ...
- quartz 分布式_后端必备分布式技术之-调度系统Quartz设计原理
调度系统作为分布式系统技术中重要的一环,了解其技术原理必不可少,不同系统内部采用的调度系统叫法不一样,但大致功能都类似,而Quartz作为经典的开源企业级调度系统,怎么能不研究一下呢? 为什么要学习q ...
- 华为18级大牛倾情奉送:分布式服务框架和微服务设计原理实战文档,啃完发现涨薪如此简单
前言 分布式服务框架不仅仅包含核心的运行时类库,还包括服务划分原则.服务化最佳实践.服务治理.服务监控.服务开发框架等,它是一套完整的解决方案,用来协助应用做服务化改造,以及指导用户如何构建适合自己业 ...
- 【niubi-job——一个分布式的任务调度框架】----框架设计原理以及实现
来自: http://www.cnblogs.com/zuoxiaolong/p/niubi-job-3.html 引言 niubi-job的框架设计是非常简单实用的一套设计,去掉了很多其它调度框架中 ...
- Redis核心数据结构List应用场景-商品列表、缓存击穿、PV阅读量、抢红包、推送帖子、普通分布式锁、Redis可重入锁与红锁
List应用场景 Redis之List 一. Redis list命令实战 二.商品列表 高并发的淘宝聚划算实现技术方案 SpringBoot+Redis实现商品列表功能 二.缓存击穿 什么是缓存击穿 ...
- 分布式事务架构设计原理
随着业务需求的复杂化,企业应用规模不断扩大,在后端开发中经常会遇到以下问题: 业务的并发要求非常高,对应的业务需要通过微服务拆分,甚至分库分表等架构设计才能满足并发需求,此时业务操作无法在同一个数据库 ...
最新文章
- Python实例浅谈之五Python守护进程和脚本单例运行
- git 如何正确的提交文件
- python3默认的代码编码是什么-Python3 到底什么是字符编码
- python tkinter库函数详解_Python使用tkinter库进行GUI编程中常用事件处理方式汇总
- Oracle Net
- java初级面试总结
- 如何用VNC远程管理Linux桌面
- 差别-request.getParameterValues与request.getParameter
- Take me to your heart 《吻别》英文版 已配了歌词
- 关于destoon系统遇到的一些问题总结
- 安卓MediaCodec编码aac
- 只是想要自己喜欢的生活,可是你有资格么?
- python如何采集同花顺股票日度历史数据
- u盘格式化了怎么恢复数据
- 阴阳师自动御魂觉醒超鬼王脚本
- web前端三大核心技术
- html5 端午节 龙舟,端午节赛龙舟的作文(精选10篇)
- 微信小程序——wxs脚本
- 项目管理 - PM、 SRS、SOW简介及范例
- 优化MATLAB中quiver函数绘制箭头图或矢量图(1)-MATLAB开发