Redis实现分布式锁原理

Redis 实现分布式锁实际上是通过setnx 命令, 如果有该key值, 则设置失败, 没有该key, 设置成功.
但是由于setnx 命令没有过期时间的, 需要额外对key设置过期时间, 但是这个是两步操作, 不能保证其原子性.

如下的图中, 就是保证了原子性, 并且能够达到与setnx一致的效果.
set key value 传入ex是秒, px 是毫秒 NX 是键不存在时 ,才能设置, 否则返回nil,
XX 是键存在时, 才能进行操作, 否则返回nil
Redis实现分布式锁原理
例如如下 使用 set key value EX seconds NX 语句
只有thread0 这个key不存在时 ,才会操作成功, 返回ok , 并且可以使用ttl 查看过期时间.
设置的过期时间为100s , 在未过期时, 对其设置, 返回nil

此时这个key可以是某个资源(例如某个商品id ), 当某个线程获得了这个资源的时候, 其他线程想要获得这把锁, 返回的都是nil , 只有这个线程释放了这个key 的时候, 其他线程才能获得此资源.
Redis实现分布式锁原理
如下是使用 set key value EX value XX的用法, 当其key存在时, 才能对其设置值, 否则返回nil .
Redis实现分布式锁原理
Redis实现分布式锁原理