redis的setnx实现分布式锁

SETNX 是 Redis 提供的一个原子(atomic)操作命令,用于设置一个 key 及其对应的 value,如果并且仅当该 key 不存在。如果 key 已经存在,SETNX 命令不会执行任何操作。

Redis 的 SETNX 命令的底层原理建立在 Redis 单线程的事件驱动模型上。这意味着 Redis 用单个线程按顺序执行所有命令,这使得每个命令都是原子性的。当一个 SETNX 命令被发出时,Redis 服务器会对 key-value 存储结构进行以下操作:

检查 key 是否存在:

Redis 首先检查 key 是否在当前数据库的 key-space 中存在。因为操作是在单个线程中顺序执行的,所以不存在并发问题。

设置值:

如果 key 不存在,Redis 将为该 key 创建一个新的条目,并设置提供的 value。整个操作从开始到结束是连续执行的,所以不会有其他操作跟这个操作冲突。

返回结果:

如果 key 被成功设置,Redis 返回 1如果 key 已经存在,那么 SETNX 将不做任何改变,并返回 0

需要注意的是,SETNX 本身并不具备锁的超时能力,可能会导致死锁的情况发生(例如,持有锁的进程意外终止而没能释放锁)。因此在 Redis 2.6.12 版本之后,推荐使用 SET 命令结合 NX 和 PX毫秒(或 EX秒)选项,来同时设置键的值和过期时间,从而得到一个更健壮的锁行为:

SET lock_key unique_lock_value NX PX 30000
这个命令尝试设置一个 key,并且设置 30 秒的过期时间,保证即使锁的持有者在未能释放锁的情况下崩溃,锁也会在 30 秒后自动释放。

相关推荐

  1. 使用redissetnx实现分布式

    2024-07-10 00:54:02       29 阅读
  2. redissetnx实现分布式

    2024-07-10 00:54:02       22 阅读
  3. Redis实现分布式

    2024-07-10 00:54:02       39 阅读
  4. Redis分布式实现

    2024-07-10 00:54:02       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 00:54:02       49 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 00:54:02       53 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 00:54:02       42 阅读
  4. Python语言-面向对象

    2024-07-10 00:54:02       53 阅读

热门阅读

  1. Bert 变种, T5模型

    2024-07-10 00:54:02       16 阅读
  2. Docker实战教程(一)

    2024-07-10 00:54:02       20 阅读
  3. Visual Studio编译优化选项

    2024-07-10 00:54:02       17 阅读
  4. Pywinauto:强大的Windows 应用程序测试工具

    2024-07-10 00:54:02       20 阅读
  5. Linux grep技巧 结合awk查询

    2024-07-10 00:54:02       14 阅读
  6. Appium:强大的移动应用测试工具

    2024-07-10 00:54:02       20 阅读
  7. 宝塔-Linux模板常用命令-centos7

    2024-07-10 00:54:02       16 阅读
  8. 仙人掌中的SNMP检测不到服务器

    2024-07-10 00:54:02       19 阅读
  9. 算法力扣刷题 三十四【71.简化路径】

    2024-07-10 00:54:02       18 阅读