购物网站页面设计图片,网站建设与网页制作实训报告,网络推广公司重诚,郑州做网站公司中boolean res lock.tryLock(100, 10, TimeUnit.SECONDS); RedissonLock里面有这样一个方法tryLock()#xff0c;意思是尝试获取锁的结果。 最大等待时间100s#xff0c;并且获取到锁之后#xff0c;10s之内没有释放的话#xff0c;锁会自动失效。
尝试获取锁超时
time …boolean res lock.tryLock(100, 10, TimeUnit.SECONDS); RedissonLock里面有这样一个方法tryLock()意思是尝试获取锁的结果。 最大等待时间100s并且获取到锁之后10s之内没有释放的话锁会自动失效。
尝试获取锁超时
time waitTime是我们指定的最大的等待获取锁的时间比如是100秒 current 第一次尝试获取锁之前的一个时间戳
当前时间减去current 第一次获取锁耗费的时间假设是1秒
time - 第一次获取锁耗费的时间 100秒 - 1秒 99秒最多再等待99秒尝试获取这个锁如果第一次获取锁的时间直接超过了waitTime等待最大超时时间就会直接标记为获取锁失败
current 当前时间
final RFutureRedissonLockEntry subscribeFuture subscribe(threadId);
if (!await(subscribeFuture, time, TimeUnit.MILLISECONDS)) {
if (!subscribeFuture.cancel(false)) {
subscribeFuture.addListener(new FutureListenerRedissonLockEntry() {
Override
public void operationComplete(FutureRedissonLockEntry future) throws Exception {
if (subscribeFuture.isSuccess()) {
unsubscribe(subscribeFuture, threadId);
}
}
});
}
acquireFailed(threadId);
return false;
}他肯定是做了一些事情看起来是订阅了什么东西基于redis的PUB/SUB发布订阅模型订阅了什么东西执行了一些操作所以在下面将可以等待的时间又减去了这段时间的耗时比如说是1秒
此时time 98秒
接下来进入死循环不断的尝试获取锁、等待每次time都不断的减去尝试获取锁的耗时以及等待的耗时然后如果说在time范围内获取到了锁就会返回true如果始终无法获取到锁的话那么就会在time指定的最大时间之后就返回一个false
超时锁自动释放
就是我们自己定义了一个leaseTime和TimeUnit
if (leaseTime ! -1) { return tryLockInnerAsync(leaseTime, unit, threadId, RedisCommands.EVAL_LONG); } 如果你没传递这个leaseTime的话这个if分支是不会走的
RFutureLong ttlRemainingFuture tryLockInnerAsync(commandExecutor.getConnectionManager().getCfg().getLockWatchdogTimeout(), TimeUnit.MILLISECONDS, threadId, RedisCommands.EVAL_LONG);用默认的LockWatchdogTimeout()时间30000毫秒30秒
如果你自己指定了一个leaseTime就会直接执行lua脚本去加锁加完锁的结果就直接返回了并不会对那个future加一个监听器以及执行定时调度任务去刷新key的生存周期因为你已经指定了leaseTime以后就意味着你需要的是这个key最多存在10秒钟必须被删除
这个逻辑是当锁不存在的时候新增一个redis数据 if (redis.call(‘exists’, KEYS[1]) 0) then redis.call(‘hset’, KEYS[1], ARGV[2], 1); redis.call(‘pexpire’, KEYS[1], ARGV[1]); return nil; end;
命令大概是这样 hset anyLock 7124f827-475a-4e66-9f3c-fc00e8e8712e:1 1
redis中新增锁之后的数据类型如下 anyLock: { “7124f827-475a-4e66-9f3c-fc00e8e8712e:1”: 1 }
这个命令是设置过期时间 pexpire anyLock 10000
也就是说人家在加锁的时候就设定好了我们的锁key最多就只能存活10秒钟而且后台没有定时调度的任务不断的去刷新锁key的生存周期
我们的那个锁到了10秒钟就会自动被redis给删除生存时间只能是10秒钟然后就会自动释放掉了别的客户端就可以加锁了但是在10秒之内其实你也可以自己去手动释放锁
无非就是我们上一讲讲的原理递减加锁次数删除锁key