zookeeper实现分布式锁的原理及具体使用案例
zookeeper跟redis一样,也是基于内存的。
官网:
http://zookeeper.apache.org/
zookeeper是分布式系统的协调服务,提供配置管理、分布式协同、命名的中心化服务以及服务注册发现等。
zookeeper分布式锁的实现原理:
zookeeper实现分布式锁采用其提供的有序临时节点+监听来实现。临时节点只要客户端断开连接就会被删除,正好可以利用这一特性实现锁。
zookeeper是由java语言开发的。
zookeeper中的节点类型:
节点就是用于存储数据的,在zookeeper中,节点是类似于文件系统的目录的结构。
①永久节点。会进行持久化,重启不会丢失。
②临时节点。存储在内存中,不会持久化,重启服务或断开连接数据会丢失。
节点中存储的数据可以进行排序。
当节点中的数据有更新或是节点被删除时,会触发zookeeper的通知机制告知客户端,因为zookeeper一直在监听所有的节点。
领红包具体案例:
【具体业务逻辑是:先查询下数据库,判断用户的红包数据是否为空,是则插入红包数据,否则不让插入】
①引入zkclient依赖:
<!--zookeeper客户端zkclient--><!-- https://mvnrepository.com/artifact/com.101tec/zkclient --><dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.11</version></dependency>
②代码实现:
接口:
package com.zhangxueliang.demo.springbootdemo.zookeeperLock;public interface ZookeeperLock {//加锁void lock();//解锁void unlock();}
抽象类:
package com.zhangxueliang.demo.springbootdemo.zookeeperLock;import org.I0Itec.zkclient.ZkClient;import java.util.concurrent.CountDownLatch;/*** @ProjectName springbootdemo_src* @ClassName AbstractZookeeperLock* @Desicription tryLock和waitLock方法使用到了模板方法设计模式* @Author Zhang Xueliang* @Date 2020/1/13 14:19* @Version 1.0**/ public abstract class AbstractZookeeperLock implements ZookeeperLock {protected String lock;protected CountDownLatch countDownLatch;//门闩(倒计数器)protected String zk_address = "127.0.0.1:2181";protected ZkClient zkClient = new ZkClient(zk_address);/*** 加锁*/@Overridepublic final void lock() {//尝试获取锁if (tryLock()){//已经拿到锁System.out.println("获取锁成功。。。");}else {//尝试获取锁未成功,等待获取锁,阻塞,如果此处已经不阻塞了,那么可以继续往下执行代码waitLock();//上面的阻塞结束了,那么我可以继续获取锁,递归一下}}/*** 释放锁*/@Overridepublic final void unlock() {//关闭连接就解锁了if(zkClient!=null){zkClient.close();//此处也可以使用zkClient.delete(临时节点)来实现解锁System.out.println("解锁成功。。。");}}//尝试获取锁protected abstract boolean tryLock();//等待获取锁protected abstract void waitLock(); }
锁实现类:
package com.zhangxueliang.demo.springbootdemo.zookeeperLock;import org.I0Itec.zkclient.IZkDataListener;import java.util.concurrent.CountDownLatch;/*** @ProjectName springbootdemo_src* @ClassName ZookeeperDistributedLock* @Desicription TODO* @Author Zhang Xueliang* @Date 2020/1/13 14:32* @Version 1.0**/ public class ZookeeperDistributedLock extends AbstractZookeeperLock {public ZookeeperDistributedLock(String lockName){lock=lockName;}/*** 尝试获取锁* @return*/@Overrideprotected boolean tryLock() {try {//创建一个临时节点zkClient.createEphemeral(lock);return true;}catch (Exception e){return false;}}/*** 等待获取锁*/@Overrideprotected void waitLock() {//如果已经有线程创建了临时节点,那么其他线程就只能等待,不能再创建该临时节点//此时我就监听(就是订阅数据的改变)你这个临时节点,如果该节点被删除了我就等待结束,就又可以创建临时节点//1.订阅数据改变,就是指定监听参数中所指定的那个节点IZkDataListener listener = new IZkDataListener() {//监听改变@Overridepublic void handleDataChange(String s, Object o) throws Exception {}//监听删除@Overridepublic void handleDataDeleted(String s) throws Exception {if (countDownLatch!=null){countDownLatch.countDown();}}};//2.判断锁的节点是否存在if (zkClient.exists(lock)){countDownLatch = new CountDownLatch(1);try {//当计数器从1变成0之后,等待就会结束了countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}}//3.取消订阅zkClient.unsubscribeDataChanges(lock,listener);}}
zookeeper分布式锁代码测试:
//测试public static void main(String[] args) {ZookeeperDistributedLock zookeeperDistributedLock = new ZookeeperDistributedLock("/addRedPacket");//一定要带/ 不然节点添加不成功try{zookeeperDistributedLock.lock();//TODO 具体要锁住的业务代码//查询用户是否已经领过红包//添加红包给用户}finally {zookeeperDistributedLock.unlock();}}
测试时需要将zoo_sample.cfg配置文件中的zookeeper最大连接数调大些:
maxClientCnxns=1000 #默认60
启动两个端口:
配置nginx.conf实现负载均衡
使用jmeter测试时访问的是nginx的80端口:
使用jmeter模拟高并发场景:
相关参数配置--
zookeeper实现分布式锁的原理及具体使用案例相关推荐
- 【Zookeeper】基于Zookeeper实现分布式锁
1.概述 转载:基于Zookeeper实现分布式锁 1.1 为什么使用分布式锁 我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,我们往往采用synchronized或者Lock ...
- 肝一下ZooKeeper实现分布式锁的方案,附带实例!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 zookeeper客户端选型 原生zookeeper客户端,有wa ...
- 请列举你了解的分布式锁_面试官想要你回答的分布式锁实现原理
写在前面 在了解分布式锁具体实现方案之前,我们应该先思考一下使用分布式锁必须要考虑的一些问题. 互斥性:在任意时刻,只能有一个进程持有锁. 防死锁:即使有一个进程在持有锁的期间崩溃而未能主动释放锁, ...
- 基于 Zookeeper 的分布式锁实现
1. 背景 最近在学习 Zookeeper,在刚开始接触 Zookeeper 的时候,完全不知道 Zookeeper 有什么用.且很多资料都是将 Zookeeper 描述成一个"类 Unix ...
- 漫画:如何用Zookeeper实现分布式锁?
转载自 漫画:如何用Zookeeper实现分布式锁? 什么是临时顺序节点? 让我们来回顾一下Zookeeper节点的概念: Zookeeper的数据存储结构就像一棵树,这棵树由节点组成,这种节点叫 ...
- ieee39节点系统介绍_Java秒杀系统实战系列-基于ZooKeeper的分布式锁优化秒杀逻辑...
本文是"Java秒杀系统实战系列文章"的第十六篇,本文我们将继续秒杀系统的优化之路,采用统一协调调度中心中间件ZooKeeper控制秒杀系统中高并发多线程对于共享资源~代码块的并发 ...
- 利用Zookeeper实现 - 分布式锁
微信原文: 利用Zookeeper实现 - 分布式锁 博客原文:利用Zookeeper实现 - 分布式锁 在许多场景中,数据一致性是一个比较重要的话题,在单机环境中,我们可以通过Java提供的并发AP ...
- 技术分享| 基于 Etcd 的分布式锁实现原理及方案
1. 为什么选择 Etcd 据官网介绍,Etcd 是一个分布式,可靠的 Key-Value 存储系统,主要用于存储分布式系统中的关键数据.初见之下,Etcd 与 NoSQL 数据库系统有几分相似,但作 ...
- 基于 Kafka 和 ZooKeeper 的分布式消息队列原理
转载:https://gitbook.cn/books/5bc446269a9adf54c7ccb8bc/index.html 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量 ...
最新文章
- 确认和回调_【短线回调,确认突破点】
- Oracle Ora 错误解决方案合集
- pythonweb开发-一步步教你开始使用Python开发Web应用
- 百度超级链XChain(5)XuperBridge 智能合约接口
- C++学习之路: 单例模板
- Netbeans8下 Weblogic EJB案例
- 内联元素,取消间隙和默认效果
- 【华为云技术分享】云图说 | 云硬盘还可以共享?!不了解你就out了
- DPDK X710 DDP PPPoE 实践
- SM1、SM2 、SM3、 SM4算法
- nandflash驱动详解
- 【Python精华】100个Python练手小程序
- Android APP开发入门教程
- React.js学习(一):设计并实现一个“任务清单列表”
- linux 虚拟光驱软件,在Linux操作系统下使用虚拟光驱的方法
- apache atlas 编译包下载
- Rockchip Android平台GPU/DDR负载变频阈值调整方法
- android ppsspp 存档位置,ppsspp怎么用,ppsspp怎么用psp存档
- Linux man page命令后的数字含义
- TroubleShooting_配置正确的WAU