Redisson原理:
1.第一个参数-1,表示锁过期时间,-1表示是看门狗机制自动续命;
2.leaseTime 的时间单位,与 -1L 配套,表示无需单位
3.interruptibly:false 不响应中断(Thread.interrupt() 无效);不支持中断(Thread.interrupt() 不会打断加锁等待)。
2.去加锁
2.1通过lua脚本来实现加锁/返回过期手贱,保证原子性
lua脚本展开如下:
if ((redis.call('exists', KEYS[1]) == 0) or (redis.call('hexists', KEYS[1], ARGV[2]) == 1)) then
redis.call('hincrby', KEYS[1], ARGV[2], 1)
redis.call('pexpire', KEYS[1], ARGV[1])
return nil
end
return redis.call('pttl', KEYS[1])
解释:先判断exists整体是否存在,如果没有会加;第二次进来,因为存在了,会通过hexists判断是不是我自己的,如果不是不能进去,如果是可以冲入;
如果存在且不是自己的返回锁的剩余时间;
补充: 锁的key是我们传入的商品id,field是: 服务实例唯一标识 ID + 线程id保证是自己的标识
锁的时间默认30秒,自动装配Redisson的时候config.setLockWatchdogTimeout(30000);可以设置
2.2如果锁成功会开启看门狗机制 源代码如下: