redisson version:2.1.4
去查看源码的原因:
以前简单理解的基于redis的锁,就是去setnx一个key,然后设置一个过期时间。多线程的时候,谁能set成功,说明谁获取锁成功。
然后解锁操作就是删除之前的key或者等待过期。
现在用了下redisson的锁,开始也以为是这样的,认为其他线程也能强制解锁。结果测试发现不行。
源码:
获取锁
<span style="font-size:14px;">private Long tryLockInner(final long leaseTime, final TimeUnit unit) {
internalLockLeaseTime = unit.toMillis(leaseTime);
return commandExecutor.evalWrite(getName(), RedisCommands.EVAL_INTEGER,
//step1
"local v = redis.call('get', KEYS[1]); " +
"if (v == false) then " +
//step2
" redis.call('set', KEYS[1], cjson.encode({['o'] = ARGV[1], ['c'] = 1}), 'px', ARGV[2]);