使用Redis实现分布式锁
一.介绍 分布式锁,或者称为“全局锁”,在分布式环境中,保证锁只能被一个对象(或者成为“事务”)获取,经常出现在“避免数据重复处理”、“接口幂等”的场景。 下面介绍了Redis中两种分布式锁的实现方式。 二.setnx + expire组合 2.1命令介绍 使用setnx和expire命令组合实现,这两个命令用法如下: setnx key value expire key seconds 对于setnx来说,只有key不存在,或者已经过期,setnx才会成功(返回1),否则失败(返回0)。 expire可以用来对key的有效期进行设置,若不设置key的有效期,则默认为-1,表示一直有效; 2.2操作步骤 实现分布式锁的时候,方式很简单: 2.现有A、B两个线程尝试获取同一个全局锁,假设先接收到A的请求; 3.直接执行setnx命令,key为foo,value可以根据业务制定,比如A的名称或者某个特殊的值; 4.如果setnx加锁成功,那么使用expire去设置key的过期时间,防止一直不释放锁的情况出现; 5.加锁成功后,且设置过期时间成功后,执行自己的业务逻辑(获取到全局锁的逻辑),等待 锁自动过期释放 或者 手动删除(del命令) ; 6.如果setnx加锁失败,则根据自己业务逻辑进行其他操作(未获取到全局锁的逻辑)。 2.3释放锁存在的问题