Zookeeper绍二(分布式锁介)
2024-10-20 00:22:43
一、为什么会有分布式锁?
在多线程环境下,由于上下文的切换,数据可能出现不一致的情况或者数据被污染,我们需要保证数据安全,所以想到了加锁。
所谓的加锁机制呢,就是当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问,直到该线程读取完,其他线程才可使用。
我们为了减少DB的压力,把库存预热到了KV,现在KV的库存是1。
- 服务A去Redis查询到库存发现是1,那说明我能抢到这个商品对不对,那我就准备减一了,但是还没减。
- 同时服务B也去拿发现也是1,那我也抢到了呀,那我也减。
- C同理。
- 等所有的服务都判断完了,你发现诶,怎么变成-2了,超卖了呀,这下完了。
正常线程进程同步的机制有哪些?
- 互斥:互斥的机制,保证同一时间只有一个线程可以操作共享资源 synchronized,Lock等。
- 临界值:让多线程串行话去访问资源
- 事件通知:通过事件的通知去保证大家都有序访问共享资源
- 信号量:多个任务同时访问,同时限制数量,比如发令枪CDL,Semaphore等
分布式锁实现主要以Zookeeper(以下简称zk)、Redis、MySQL这三种为主。
Zookeeper分布式锁
他主要的应用场景有以下几个:
- 服务注册与订阅(共用节点)
- 分布式通知(监听znode)
- 服务命名(znode特性)
- 数据订阅、发布(watcher)
- 分布式锁(临时节点)
ZK:他是个数据库,文件存储系统,并且有监听通知机制(观察者模式)
节点
zk的节点类型有4大类
持久化节点(zk断开节点还在)
持久化顺序编号目录节点
临时目录节点(客户端断开后节点就删除了)
临时目录编号目录节点
节点的创建:
create /test laogong // 创建永久节点
create -e /test laogong // 创建临时节点
create -s /test // 创建顺序节点
create -e -s /test // 创建临时顺序节点
临时节点 退出zk后临时节点消失。。
实现原理:
描述:
利用zk的临时顺序节点 取最小节点 获取锁 不是最小节点不获取
余下的利用监听机制 各自监听自己的前一个节点 前一个节点存在就阻塞 不存在就获取锁
当获取锁的节点释放锁后 删除自己的临时顺序节点 如果服务宕机也不影响 删除 后续节点也可以获取锁 不会一直阻塞
代码:
最新文章
- Tomcat服务器中配置多个域名,访问不同的web项目
- UIMenuController的使用,对UILabel拷贝以及定制菜单
- 使用FEST-Swing测试GUI
- android部分手机onclick事件触发2次
- poj3252
- python爬虫scrapy的Selectors参考文档
- struts2文件上传,文件类型 allowedTypes
- js 的其它运算符和优先级
- 无法捕获的异常:MissingMethodException
- Android 新一代多渠道打包神器
- centos ios镜像文件 安装详细
- easyui1.2.6 validate输入框验证在火狐下的一个bug
- 201521123042 《java程序设计》 第八周学习总结
- 《JAVA程序设计》第11周学习总结
- 使用qt制作一个简单的计算器
- git checkout+文件丢失
- Java体系学习书籍推荐
- Cordova入门系列(四)自定义Cordova插件--showToast
- MongoDB日常运维操作命令小结
- jenkins实战(二):构建自由风格的maven项目
热门文章
- [BUUCTF]PWN——picoctf_2018_buffer overflow 1/2
- Linux 输入指令显示 command not found(未找到命令)解决办法
- DG修复:异常关库导致的数据库启动失败ORA-01110及GAP修复
- JAVA比较两个版本号的大小
- 交通运输类文档下载——JT/T 808-2019、JT/T 809-2019文档分享
- 【LeetCode】485. Max Consecutive Ones 解题报告(Java & Python)
- 【LeetCode】730. Count Different Palindromic Subsequences 解题报告(Python)
- Java编程基础
- MySQL 的性能
- Unsupervised Domain Adaptation by Backpropagation