基于SETNX的锁,类似《Redis setNX 实现分布式锁(重复数据插入可用其来实现排他锁)》,在SETNX的Value里面设置超时时间,超时时存在多个进程同时解锁情况。使用Redis的SETNX和TTL就可以解决这个问题。
算法如下:
1. 使用SETNX加锁
1.1)获取锁,使用expire设置TTL时间。加锁成功,处理业务。跳转2.
1.2)加锁失败,利用TTL获取TTL时间。如果没有时间,设置一个时间。加锁失败,根据TTL时间休眠,返回1
2. 业务处理完成,解锁。
3. 超时后,会自动解锁。
说明:设置的超时时间必须大于处理时间,否则可能存在多个进程进入临界区。
使用SET key value [EX seconds] [PX milliseconds] [NX|XX]可以简化。
算法如下:
1. 使用 SET key value EX seconds NX 加锁
1.1)返回OK。加锁成功,处理业务。跳转2.
1.2)返回null。加锁失败,根据TTL时间休眠,返回1
2. 业务处理完成,解锁。
3. 超时后,会自动解锁。
说明:设置的超时时间必须大于处理时间,否则可能存在多个进程进入临界区。