秋招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。

相关推荐
许彰午11 小时前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
Bat U12 小时前
JavaEE|多线程初阶(七)
java·开发语言
掌心向暖RPA自动化15 小时前
如何获取网页某个元素在屏幕可见部分的中心坐标影刀RPA懒加载坐标定位技巧
java·javascript·自动化·rpa·影刀rpa
日取其半万世不竭15 小时前
Minecraft Java版社区服务器搭建教程(Linux,适合新手)
java·linux·服务器
TeamDev16 小时前
JxBrowser 9.0.0 版本发布啦!
java·前端·混合应用·jxbrowser·浏览器控件·跨平台渲染·原声输入
AI人工智能+电脑小能手16 小时前
【大白话说Java面试题】【Java基础篇】第24题:Java面向对象有哪些特征
java·开发语言·后端·面试
AI人工智能+电脑小能手17 小时前
【大白话说Java面试题】【Java基础篇】第25题:JDK1.8的新特性有哪些
java·开发语言·后端·面试
likerhood17 小时前
SLF4J: Failed to load class “StaticLoggerBinder“ 解决
java·log4j·maven
早日退休!!!17 小时前
大模型推理瓶颈七层分析模型
java·服务器·数据库
KmSH8umpK17 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第三篇
redis·分布式·wpf