网站首页 > java教程 正文
一、为什么我们要用分布式锁?
比如说你做一个秒杀活动,在单机情况下,我们可以使用 Java 基础中的互斥锁来保证对库存共享变量进行多线程同步访问,防止出现“超卖”现象。
但是,随着业务量扩大,分布式集群,Nginx负载均衡,传统的方式根本不能保障库存共享变量的可见性。
二、Zookeeper 分布式锁
相信不少小伙伴使用 Redis 分布式锁来解决“超卖”问题,使用 Redis 分布式锁会有一个问题,如果业务处理时间大于分布式锁失效时间呢??有一种解决方案是 Redisson 分布式锁,感兴趣的可以深入研究。我们这里介绍一下 ZooKeeper 分布式锁。
1、认识 Zookeeper(以下简称 zk)
相信很多 Java 小伙伴 认识 zk 是从 dubbo 开始,使用 zk 做注册中心,注意这是一个考点哦,dubbo 是怎样把服务注册到 zk 上,详细描述下。
① zk 通俗解释
我们可以把 zk 看做文件目录系统,就像我们 windos 下的 D 盘文件一样,我们可以对文件进行增删改查,而且 zk 提供监听通知机制。
② zk 节点
zk 文件目录系统里存储节点,节点可以分为 4 种类型
- 持久化节点(zk 客户端断开,数据还在)
- 持久化顺序节点
- 临时节点(zk 客户端断开,数据消失)
- 临时顺序节点
③ windows 下简单玩玩 zk
【方式一】
? 傻瓜式安装,唯一需要注意的点是复制一份zoo_sample.cfg,改名 zoo.cfg。
为啥呢,这是因为 /bin 目录下的 zkEnv.cmd 中扫描的是 zoo.cfg
? 双击 zkServer.cmd,启动 zk 服务,默认是 127.0.0.1:2181
? 双击 zkCli.cmd ,启动一个 zk 客户端,这个时候你就可以 创建 zk 节点了
创建节点的命令
//-s为有序节点,-e为临时节点,path 路径带上斜杆/
create [-s] [-e] path data
【方式二】
Idea 插件,注意这种方式操作临时节点显示会有延迟
2、zk 可以用来做什么???
- 服务注册与订阅(共用节点)
- 分布式通知(监听 znode)
- 服务命名(znode 特性)
- 数据订阅、发布(watcher)
- 分布式锁(临时节点)?
3、分布式锁(重点)
① zk 有 4 种节点方式,选择哪一种合适?
当然选择 临时顺序节点
好处一,客户端断开,临时节点消失,释放锁;好处二只需监听上一个节点。
注意:有序节点生成 path 会自动生成后缀编码,如下
② 分布式锁实现原理
- 每个客户端往/locks下创建临时有序节点/locks/lock_,创建成功后/locks下面会有每个客户端对应的节点 ,如/locks/lock_0000000001
- 客户端取得/locks下的子节点,并进行排序,判断排在最前面的是否是自己,如果自己在第一位,表示获取锁成功
- 果自己的锁节点不在第一位,则监听自己前一个节点的锁节点,例如锁节点 lock_0000000002,那么监听锁节点 lock_0000000001
- 当前一个锁节点 lock_0000000001 对应的客户端执行完成,释放锁,将会触发监听客户端 lock_0000000002的逻辑
- 监听客户端重新执行第2步逻辑,判断自己是否获取了锁
③ 用 Curator 实现分布式锁
Curator 是 原生 zk api 的一层封装,是最流行的 zk 客户端
@Python大星 | 文
猜你喜欢
- 2024-11-22 redis分布式锁
- 2024-11-22 4K字深度剖析redisson分布式锁原理
- 2024-11-22 java都为我们提供了各种锁,为什么还需要分布式锁?
- 2024-11-22 一文带你了解Java手写分布式锁的实现
- 2024-11-22 如何用Redisson框架实现分布式锁?
- 2024-11-22 基于 Redis 实现的分布式锁
- 2024-11-22 京东秒杀系统模块的Redis分布式锁深度剖析,没给你讲明白你打我
- 2024-11-22 面试官:Redis分布式锁超时了,任务还没执行完怎么办?
- 2024-11-22 聊聊Redis分布式锁
- 2024-11-22 浅谈分布式锁
你 发表评论:
欢迎- 最近发表
-
- 五,网络安全IDA Pro反汇编工具初识及逆向工程解密实战
- 「JAVA8」- Lambda 表达式(java lambda表达式原理)
- 深入探讨Java代码保护:虚拟机保护技术的新时代
- Nginx反向代理原理详解(图文全面总结)
- 逆向拆解日本IT,哪些Java技术栈薪资溢价高
- mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比
- Spring Boot集成ProGuard轻松实现Java 代码混淆, Java 应用固若金汤
- 从 Java 代码逆向工程生成 UML 类图和序列图
- 人与人相处:尊重是标配,靠谱是高配,厚道是顶配
- Windows系统安装日期如何修改(windows10怎么修改安装日期)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)