当前位置: 首页 > news >正文

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 秒后自动释放。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 获取商铺信息,以及商铺信息的增删改查
  • 工厂人员定位系统介绍及解决方案
  • View->LinearLayout中动态添加多行多列的ItemView(来源RecyclerView中的ViewHodler)
  • 【Docker-compose】搭建php 环境
  • stm32h743 阿波罗v2 NetXduo http server CubeIDE+CubeMX
  • ABeam News | FY25 ABeam德硕大中华区入社式,飞往崭新航向!
  • MD5加密和注册页面的编写
  • 【Vue3】export, import, export default
  • 编程语言及系统发展:探索计算世界的演进之旅
  • 模板方法模式的实现
  • 昇思25天学习打卡营第17天|基于MobileNetv2的垃圾分类
  • 标签印刷检测,如何做到百分百准确?
  • mysql中select语句的执行顺序
  • 全网最炸裂的5款SD涩涩模型!身体真的是越来越不好了!建议收藏,晚上自己偷偷打开看!
  • p14数组(2)
  • 0x05 Python数据分析,Anaconda八斩刀
  • codis proxy处理流程
  • create-react-app项目添加less配置
  • CSS3 变换
  • github指令
  • leetcode388. Longest Absolute File Path
  • Mysql5.6主从复制
  • Shell编程
  • 订阅Forge Viewer所有的事件
  • 深度解析利用ES6进行Promise封装总结
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 使用权重正则化较少模型过拟合
  • 收藏好这篇,别再只说“数据劫持”了
  • 详解NodeJs流之一
  • 你对linux中grep命令知道多少?
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 阿里云重庆大学大数据训练营落地分享
  • 说说我为什么看好Spring Cloud Alibaba
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #pragma once
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (12)Linux 常见的三种进程状态
  • (175)FPGA门控时钟技术
  • (2.2w字)前端单元测试之Jest详解篇
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (arch)linux 转换文件编码格式
  • (SERIES12)DM性能优化
  • (不用互三)AI绘画工具应该如何选择
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (九十四)函数和二维数组
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (三分钟)速览传统边缘检测算子
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)拼包函数及网络封包的异常处理(含代码)
  • **python多态
  • ./和../以及/和~之间的区别
  • .gitignore文件_Git:.gitignore
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布