网站首页 > 精选教程 正文
一、为什么我们要用分布式锁?
比如说你做一个秒杀活动,在单机情况下,我们可以使用 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-10-10 Spring Cloud分布式云服务架构之路
- 2024-10-10 微服务、集群、分布式的区别是什么?
- 2024-10-10 2020“闭关”跳槽季,啃透分布式三大技术:限流、缓存、通讯
- 2024-10-10 手撕分布式技术:限流、通讯、缓存,全部一锅端走送给你
- 2024-10-10 基于websocket单台机器支持百万连接分布式聊天(IM)系统
- 2024-10-10 如何基于Redis实现分布式锁? 如何基于redis实现分布式锁定
- 2024-10-10 2020年面试复盘大全500道:Redis+ZK+Nginx+数据库+分布式+微服务
- 2024-10-10 c++游戏服务器方向需要多少功底? c++游戏服务器开发视频教程
- 2024-10-10 「高并发」亿级流量场景下如何实现分布式限流?看完我彻底懂了
- 2024-10-10 读写分离与分库分表,分布式事务 读写分离的优缺点
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)