Redisson看门狗
1、互斥性;
防止多个进程及线程并发访问共享资源,使得资源串行访问操作。
2、设置锁过期时间;
为了防止锁悬挂,因为服务宕机,锁不释放问题,其它请求就无法获取锁。
3、自动续锁超时时间;
防止业务超时,超过锁过期时间自动释放,打破互斥性。
4、多条指令需要原子性;
lua脚本实现多个指令的加锁、解锁及续锁的原子性。
5、可重入性;
使用线程ID信息来保证同一线程请求锁的可重入性。
6、锁误删:自己把别人持有的锁删了;
多个客户端释放锁,如何防止自己删别人的或者别人删自己申请的锁。
获取锁之前,生成全局唯一id,判断是否是自己的id来避免。
7、锁等待:发布订阅机制通知等待锁的线程;
看门狗
Redisson加锁的核心代码,本质也是通过redis的lua脚本;
waitTime:等待时间;在锁状态变为可持有之前,等待的时间,如果在这个时间内,锁一直被其他客户端线程持有,则放弃等待,返回失败;
leaseTime:持有时间;客户端获取到锁之后的最长持有时间,如果设置此参数为10秒,则10秒后,如果此客户端不释放锁,则有redis自行释放,以免造成死锁。
lockWatchdogTimeout:看门狗时间;如果客户端不设定持有时间,则持有时间会被设置为看门狗时间,默认为30秒。