Redis SETNX 分布式锁实战指南

91 阅读2分钟

Redis SETNX 分布式锁实战指南

回答

  • 这里,利用 Redis 的单线程特性,多个Redis客户端同时通过 SETNX 命令尝试获取锁。如果,返回1表示获取锁成功,否则表示获取锁失败。

    Redis Setnx(SET if Not Exists)命令,在指定的 key 不存在时,为 key 设置指定的值。

    设置成功,返回1。

    设置失败,返回0。

  • 分布式锁,实践经验分享

    1. 获取锁成功,则设置一个过期时间,防止该客户端挂了之后一直持有该锁。
    2. 释放锁的时候,需要先判断该锁是否仍然属于该客户端,如果是,则通过DEL命令释放锁。
  • SETNX 命令,实践经验分享

    SETNX 命令自身是不支持设置超时时间的,一般是结合 EXPIRE 一起使用。

    常见用法:

    SETNX key value EXPIRE key 10

    或者:

    SET key value EX 10 NX

扩展

1、此方案优点
  1. 实现简单

    SETNX 命令实现简单,易于理解和使用

  2. 性能较高

    由于,SETNX 命令的执行原子性,保证了分布式锁的正确性,

    而且,在Redis中,SETNX 命令是单线程执行的,所以性能较高。

2、此方案缺点
  1. 锁无法续期

    如果,加锁方在加锁后的执行时间较长,而锁的超时时间设置的较短,可能导致锁被误释放。

  2. 可能产生死锁

    如果,加锁方在加锁后未能及时解锁(也未设置超时时间),且该客户端崩,可能导致死锁。

  3. 存在竞争

    由于 SETNX 命令是对 Key 的操作。

    所以,在高并发情况下,多个客户端之间仍可能存在竞争,从而影响性能。

  4. setnx 不可重入

    可以借助redission封装的能力实现可重入锁

3、推荐方案

Redisson 实现分布式锁