redis实现的分布式锁:
- 使用setnx命令时,需要设置 ttl,防止系统故障导致锁无法释放。
- 自己实现的分布式锁的缺陷:我们并不知道准确的业务执行时间,因此这个过期时间不好控制。
- 不可重入
因此我们使用第三方工具redisson:
- 提供看门狗(WatchDog),一个线程获取锁成功之后,WatchDog会给持有锁的线程续期(默认每隔10s续期)
- 可重入,底层采用了一个hash结构,用线程id和该锁锁的次数作为依据,如果发现锁已经被获取了,但是是当前线程获取的,我们就可以再次获得锁,并把次数加1。如果发现这个线程id不是自己的,则无法获取锁。释放锁的时候让次数减1即可。
- 不能做到主从的强一致性,如果需要,可以使用zookeeper实现的分布式锁。
- 底层还是setnx和lua