setNX设置锁时 设置值和过期时间是个原子的操作。
对于setNX的并发性问题在底层实现上有这些措施。
1.对锁加一个过期时间,防止客户端A设置了锁,然后客户端挂了,锁一直得不到释放这种情况。
2.释放锁的操作必须使用Lua脚本来实现。释放锁其实包含三步操作:'GET'、判断和'DEL',用Lua脚本来实现能保证这三步的原子性。否则,如果把这三步操作放到客户端逻辑中去执行的话,就有可能发生这种问题:
-
客户端1从阻塞中恢复过来,执行
DEL
操纵,释放掉了客户端2持有的锁。
3.设置锁的时候每个客户端会带上一个随机值。
SET resource_name my_random_value NX PX 30000
<