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

Redis 实现分布式锁

 分布式锁是一种用于在分布式系统中实现同步和互斥访问的机制。在分布式系统中,多个节点同时访问共享资源可能会导致数据不一致或竞争条件的发生。分布式锁提供了一种保护共享资源的方式,以确保在任意时刻只有一个节点可以访问该资源,如:同一时刻每个订单只能有一个线程操作取消订单功能。

常见分布式锁实现:
MySQL:MySQL本身就带有锁机制,由于业务特性使用MySQL作为分布式锁并不合适,而且性能一般,一般很少使用MySQL来实现分布式锁。
ZooKeeper:ZooKeeper是企业级开发中较好的一个实现分布式锁的方案,相对于Redis,ZooKeeper的部署和维护复杂一些。此外,ZooKeeper的性能相对较低,适用于对性能要求不高的场景。
Redis:Redis分布式锁的实现通常使用了SETNX(SET if Not eXists)命令和EXPIRE命令。使用SETNX可以尝试将一个键值对设置到Redis中,只有在该键不存在的情况下才能成功。成功获取锁的客户端可以设置一个过期时间,确保即使在发生故障的情况下,锁也能自动释放。
二、分布式锁具备的特点
实现的分布式锁,需要具备一下特征:

Redis 实现分布式锁的几种常见方式:

SETNX 命令实现

  • 加锁:使用 SETNX 命令尝试设置锁对应的 key,如果 key 不存在,则设置成功,获取锁。

  • 解锁:直接使用 DEL 命令删除对应的 key。但为了避免误删其他线程的锁,建议使用 Lua 脚本,通过 key 对应的 value 值来判断是否是自己的锁。

SET 命令实现

  • 加锁:使用 SET 命令,结合 NXEX 选项,一次性完成设置 key 和设置过期时间的操作。例如:SET resource_1 random_value NX EX 5,其中 resource_1 是锁的 key,random_value 是随机值,EX 5 表示设置过期时间为 5 秒。

  • 解锁:使用 DEL 命令删除 key。

Redisson 客户端实现

  • 加锁:通过 Redisson 客户端的 RLock 接口获取锁对象,调用 lock() 方法获取锁。如果未指定锁超时时间,会使用 Watch Dog 自动续期机制。

  • 解锁:调用 unlock() 方法释放锁。

RedLock 算法实现

  • 加锁:客户端向 Redis 集群中的多个独立的 Redis 实例依次请求申请加锁,如果客户端能够和半数以上的实例成功地完成加锁操作,则认为客户端成功地获得分布式锁。

  • 解锁:如果加锁失败,则要解锁所有的节点,不管该节点加锁时是否成功。


文章转载自:
http://broadleaf.kjawz.cn
http://boob.kjawz.cn
http://chlorination.kjawz.cn
http://aminophenol.kjawz.cn
http://chemisorb.kjawz.cn
http://bethought.kjawz.cn
http://anteprohibition.kjawz.cn
http://bassist.kjawz.cn
http://boom.kjawz.cn
http://aortography.kjawz.cn
http://adenovirus.kjawz.cn
http://adjustability.kjawz.cn
http://abutment.kjawz.cn
http://benadryl.kjawz.cn
http://abutment.kjawz.cn
http://appendant.kjawz.cn
http://bso.kjawz.cn
http://associability.kjawz.cn
http://cherenkov.kjawz.cn
http://acrocentric.kjawz.cn
http://backwardation.kjawz.cn
http://breadless.kjawz.cn
http://axially.kjawz.cn
http://aculeus.kjawz.cn
http://boer.kjawz.cn
http://calyculus.kjawz.cn
http://administrators.kjawz.cn
http://bookmobile.kjawz.cn
http://bismuthous.kjawz.cn
http://bva.kjawz.cn
http://www.dtcms.com/a/261743.html

相关文章:

  • 分布式集群压测
  • 第8章-财务数据
  • VR训练美国服务器:高性能解决方案与优化指南
  • 培养你的眼力 - 摄影构图
  • Python 中 `for` 循环与 `while` 循环的性能差异:深度剖析
  • 思维提升篇-数学抽象与计算机实现
  • 从零开始构建RAG(检索增强生成)
  • C# 委托(为委托添加方法和从委托移除方法)
  • Excel限制编辑:保护表格的实用功能
  • 【C#】使用电脑的GPU与CPU的区别
  • 鸿蒙5:其他布局容器
  • 【Redis原理】Redis分布式缓存——主从复制、哨兵机制与Redis Cluster
  • deepin 25 交换 caps lctl
  • Lua现学现卖
  • SpringBoot项目使用arthas-tunnel-server
  • AtCoder AT_abc412_c [ABC412C] Giant Domino 题解
  • 【力扣 简单 C】121. 买卖股票的最佳时机
  • GitHub Actions 实现 AWS ECS 服务的多集群安全重启方案
  • 【AI实践】Mac一天熟悉AI模型智能体应用(百炼版)
  • STM32中Usart的使用
  • 一个简单测试Deepseek吞吐量的脚本,国内环境可跑
  • 1.1 基于Icarus Verilog、ModelSim和Vivado对蜂鸟E203处理器进行仿真
  • HarmonyOS File和base64字符串转换
  • Note2.2 机器学习训练技巧:Batch and Momentum(Machine Learning by Hung-yi Lee)
  • C语言二级指针与多级指针
  • cannot import name ‘TextKwargs‘ from ‘transformers.processing_utils‘
  • 【LeetCode 热题 100】438. 找到字符串中所有字母异位词——(解法二)定长滑动窗口+数组
  • LeetCode Hot 100 找到字符串中所有字母异位词
  • 编译流程详解
  • 利用ROS打印novatel_msgs/INSPVAX