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

秋招Day19 - 分布式 - 分布式锁

单体时代,可以直接用本地锁来实现对竞争资源的加锁,分布式环境下就要用到分布式锁了

有哪些分布式锁的实现方案?

MySQL分布式锁、Zookeeper分布式锁、Redis分布式锁

MySQL分布式锁如何实现?

创建一张锁表,对字段定义唯一性约束

获取分布式锁的时候,向表中插入记录,释放的时候,删除记录

这样如果有并发请求同时提交到数据库,数据库会保证只有一个请求能够得到锁。

这种属于数据库 IO 操作,效率不高,而且频繁操作会增大数据库的开销,因此这种方式在高并发、高性能的场景中用的不多。

Zookeeper如何实现分布式锁?

ZooKeeper 的数据节点内部结构和文件目录类似,例如某个ZNode下有一个 lock 节点,在此lock节点下建立子节点是可以保证先后顺序的,即便是两个进程同时申请新建节点,也会按照先后顺序建立两个节点。

将Zookeeper中的某个Znode节点作为所有锁的根目录locks/,然后对于每一把具体的锁,在locks/根目录下创建一个子节点mylock。客户端想要获取锁时,在对应子节点下再按顺序创建一个临时子节点,并拿到一个顺序递增序列号

获取锁时,当前客户端会检查自己的ZNode序列号是否是最小的,如果是,则成功获取到锁。

如果自己创建的 ZNode 不是最小的序列号,则表示锁已经被其他客户端持有。此时会对前一个ZNode设置一个Watcher进行监听,当监听到前一个ZNode被删除时,再检查一遍自己的ZNode是否拥有最小序列号,此时终于获取到锁

Redis如何实现分布式锁?

Redis 执行命令是单线程的,Redis 实现分布式锁就是利用这个特性。

实现分布式锁最简单的一个命令:setNx(set if not exist),如果不存在则更新:

setNx resourceName value

加锁了之后如果机器宕机,那我这个锁就无法释放,所以需要加入过期时间,而且过期时间需要和 setNx 同一个原子操作,在 Redis2.8 之前需要用 lua 脚本,但是 redis2.8 之后 redis 支持 nx 和 ex 操作是同一原子操作。

set resourceName value ex 5 nx
  • Redission

当然,一般生产中都是使用 Redission 客户端,非常良好地封装了分布式锁的 api,而且支持 RedLock。

http://www.lryc.cn/news/599269.html

相关文章:

  • 线性代数 下
  • 关于回归决策树CART生成算法中的最优化算法详解
  • 机器学习笔记(三)——决策树、随机森林
  • 水库大坝安全监测的主要内容
  • 在VSCode配置Java开发环境的保姆级教程(适配各类AI编程IDE)
  • 【内网穿透】使用FRP实现内网与公网Linux/Ubuntu服务器穿透项目部署多项目穿透方案
  • SSSD介绍
  • 【阅读整理】野火ADC_AD7192模块资料
  • “即时零售”风起,E3+企业中台如何赋能品牌企业破局增长?
  • CIU32L051 DMA+Lwrb环形队列实现串口无阻塞性数据的收发 + 数据百分百不丢失的实现
  • 百度蜘蛛池解析机制:原创
  • 通用CI/CD软件平台TeamCity v2025.3全新发布——主要界面交互体验升级
  • AWS CAF:企业云转型的战略指南
  • 佳能iR-ADV C5560复印机如何扫描文件到电脑
  • 零售收银系统开源代码全解析:连锁门店一体化解决方案(含POS+进销存+商城)
  • 深入解析Linux匿名管道机制与应用
  • 没有 Mac,如何上架 iOS App?多项目复用与流程标准化实战分享
  • AI浪潮涌,数据库“融合智能”奏响产业新乐章
  • 用 Docker 一键部署 Flask + Redis 微服务
  • 如何将 iPhone 备份到 Mac/MacBook
  • 从huggingface上下载模型
  • 接口相关概念
  • 门店管理智能体,为连锁运营开出健康“处方” 智睿视界
  • 【2025年7月25日】TrollStore巨魔商店恢复在线安装
  • Adv. Energy Mater.:焦耳热2分钟制造自支撑磷化物全解水电极
  • Linux 设备驱动模型
  • 如何高效通过3GPP官网查找资料
  • 从数据孤岛到融合共生:KES V9 2025 构建 AI 时代数据基础设施
  • 线段树学习笔记 - 练习题(3)
  • 专题:2025电商增长新势力洞察报告:区域裂变、平台垄断与银发平权|附260+报告PDF、原数据表汇总下载