基于Redis的SET和TTL机制实现分布式锁

基于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. 超时后,会自动解锁。

说明:设置的超时时间必须大于处理时间,否则可能存在多个进程进入临界区。

你可能感兴趣的:(基于Redis的SET和TTL机制实现分布式锁)