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实现分布式锁的原理及具体使用案例相关推荐

  1. 【Zookeeper】基于Zookeeper实现分布式锁

    1.概述 转载:基于Zookeeper实现分布式锁 1.1 为什么使用分布式锁 我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,我们往往采用synchronized或者Lock ...

  2. 肝一下ZooKeeper实现分布式锁的方案,附带实例!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 zookeeper客户端选型 原生zookeeper客户端,有wa ...

  3. 请列举你了解的分布式锁_面试官想要你回答的分布式锁实现原理

    写在前面 在了解分布式锁具体实现方案之前,我们应该先思考一下使用分布式锁必须要考虑的一些问题.​ 互斥性:在任意时刻,只能有一个进程持有锁. 防死锁:即使有一个进程在持有锁的期间崩溃而未能主动释放锁, ...

  4. 基于 Zookeeper 的分布式锁实现

    1. 背景 最近在学习 Zookeeper,在刚开始接触 Zookeeper 的时候,完全不知道 Zookeeper 有什么用.且很多资料都是将 Zookeeper 描述成一个"类 Unix ...

  5. 漫画:如何用Zookeeper实现分布式锁?

    转载自   漫画:如何用Zookeeper实现分布式锁? 什么是临时顺序节点? 让我们来回顾一下Zookeeper节点的概念: Zookeeper的数据存储结构就像一棵树,这棵树由节点组成,这种节点叫 ...

  6. ieee39节点系统介绍_Java秒杀系统实战系列-基于ZooKeeper的分布式锁优化秒杀逻辑...

    本文是"Java秒杀系统实战系列文章"的第十六篇,本文我们将继续秒杀系统的优化之路,采用统一协调调度中心中间件ZooKeeper控制秒杀系统中高并发多线程对于共享资源~代码块的并发 ...

  7. 利用Zookeeper实现 - 分布式锁

    微信原文: 利用Zookeeper实现 - 分布式锁 博客原文:利用Zookeeper实现 - 分布式锁 在许多场景中,数据一致性是一个比较重要的话题,在单机环境中,我们可以通过Java提供的并发AP ...

  8. 技术分享| 基于 Etcd 的分布式锁实现原理及方案

    1. 为什么选择 Etcd 据官网介绍,Etcd 是一个分布式,可靠的 Key-Value 存储系统,主要用于存储分布式系统中的关键数据.初见之下,Etcd 与 NoSQL 数据库系统有几分相似,但作 ...

  9. 基于 Kafka 和 ZooKeeper 的分布式消息队列原理

    转载:https://gitbook.cn/books/5bc446269a9adf54c7ccb8bc/index.html 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量 ...

最新文章

  1. 确认和回调_【短线回调,确认突破点】
  2. Oracle Ora 错误解决方案合集
  3. pythonweb开发-一步步教你开始使用Python开发Web应用
  4. 百度超级链XChain(5)XuperBridge 智能合约接口
  5. C++学习之路: 单例模板
  6. Netbeans8下 Weblogic EJB案例
  7. 内联元素,取消间隙和默认效果
  8. 【华为云技术分享】云图说 | 云硬盘还可以共享?!不了解你就out了
  9. DPDK X710 DDP PPPoE 实践
  10. SM1、SM2 、SM3、 SM4算法
  11. nandflash驱动详解
  12. 【Python精华】100个Python练手小程序
  13. Android APP开发入门教程
  14. React.js学习(一):设计并实现一个“任务清单列表”
  15. linux 虚拟光驱软件,在Linux操作系统下使用虚拟光驱的方法
  16. apache atlas 编译包下载
  17. Rockchip Android平台GPU/DDR负载变频阈值调整方法
  18. android ppsspp 存档位置,ppsspp怎么用,ppsspp怎么用psp存档
  19. Linux man page命令后的数字含义
  20. TroubleShooting_配置正确的WAU

热门文章

  1. 【NLP】深入理解word2vec
  2. 【机器学习基础】数学推导+纯Python实现机器学习算法23:kmeans聚类
  3. 全面助推国产化进程,网易云信获鲲鹏技术认证
  4. Ubuntu开机黑屏解决办法
  5. IdHttpServer实现webservice
  6. Alpha冲刺随笔集
  7. mongodb查看数据库和表的信息
  8. 日期型转json格式(springboot)
  9. 局部变量和成员变量的初始值问题
  10. 剑指offer47 不用加减乘除做加法