Summary from Redis 深度历险
分布式锁
- 原子问题 To ensure the automic
setnx lock:beihanz true
expire lock:beihanz 5
-->
set lock:beihanz true ex 5 nx
- 超时问题
Redis 的分布式锁不能解决超时问题,如果在加锁和释放锁之间的逻辑执行的太长,以至于超出了锁的超时限制,就会出现问题。因为这时候锁过期了,第二个线程重新持有了这把锁,但是紧接着第一个线程执行完了业务逻辑,就把锁给释放了,第三个线程就会在第二个线程逻辑执行完之间拿到了锁。
解决方案:使用随机数作为锁,然后再释放锁的时候判断是不是当前随机数。 - 实现可重入
使用ThreadLocal 记录当前锁的计数