zookeeper之分布式锁以及分布式计数器(通过curator框架实现)
有人可能会问zookeeper我知道,但是curator是什么呢?
其实curator是apachede针对zookeeper开发的一个api框架是apache的顶级项目 他与zookeeper原生api相比更加简洁方便使用
特别就是注册watcher这方面.再也不用我们手工去重复注册watcher了.我们只需监听一下然后curator全给我们做了.而且支持递归创建节点
和递归删除节点.
更大的优势是实现分布式锁和分布式计数器以及分布式的同步更加方便.
以前我们基于zk原生的api实现分布式锁相当麻烦,但是我们基于curator去实现分布式锁那就是特别简单的事了.
废话不多说直接上代码
一个简单的demo
/**
* 分布式锁
*/
public class CouratorLock { //初始化url
private static final String url="1.11.11.1:2181,1.11.11.2:2182,1.11.11.3:2183"; private static int count=10; public static void main(String[] args){ for(int i=0;i<10;i++){
new Thread(new Runnable() {
@Override
public void run() {
CuratorFramework zk= CuratorFrameworkFactory.builder()
.sessionTimeoutMs(5000)
.retryPolicy(new RetryNTimes(3,1000))
.connectionTimeoutMs(50000)
.connectString(url)
.build();
zk.start();
//分布式锁
InterProcessMutex lock=new InterProcessMutex(zk,"/lock");
try {
//枷锁
lock.acquire();
get();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
//释放锁
lock.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}
}
public static void get(){
count--;
System.out.println(count);
}
}
没错就是这么简单,curator为我们提供了InterProcessMutex这个类来实现分布式的锁
其中.acquire();这个方法就是开始枷锁..release();就是释放锁.
看很简单吧.相比我们用zk原生的api实现起来超级简单
其实底层还是基于临时节点实现的,而且curator支持一个更加强大的功能,就是当你的客户端下线以后再次启动如果再次期间你监听的节点的有变化,
curator的watcher会立马进行回调..
所以使用curator开发相当方便,
我们看下curator的CRUD
下面我们看下curator是怎么实现分布式计数器的
其实也是很简单,以为复杂的curator都提我们做完了
/**
* 分布式的计数器
*/
public class CuratorCounter {
//初始化url
private static final String url="1.11.11.1:2181,1.11.11.2:2182,1.11.11.3:2183"; private static int count=10; public static void main(String[] args) throws Exception { CuratorFramework zk= CuratorFrameworkFactory.builder()
.sessionTimeoutMs(5000)
.retryPolicy(new RetryNTimes(3,1000))
.connectionTimeoutMs(50000)
.connectString(url)
.build();
zk.start();
//分布式计数器
DistributedAtomicInteger counter=new DistributedAtomicInteger(zk,"/super",new RetryNTimes(3,100));
//初始化
//counter.forceSet(0);
AtomicValue<Integer> value = counter.increment();
System.out.println("原值为"+value.preValue());
System.out.println("更改后的值为"+value.postValue());
System.out.println("状态"+value.succeeded()); }
}
DistributeAtomicInteger就是curator为我们提供的分布式计数器的类
关于分布式同步机制我就不给大家介绍了.其实也是很简单的.你们自行去了解吧
能力有限,有错误之处还望指出
zookeeper之分布式锁以及分布式计数器(通过curator框架实现)的更多相关文章
- Redis的n种妙用,分布式锁,分布式唯一id,消息队列,抽奖……
介绍 redis是键值对的数据库,常用的五种数据类型为字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset) Redis用作缓存,主要两个 ...
- Redis实现的分布式锁和分布式限流
随着现在分布式越来越普遍,分布式锁也十分常用,我的上一篇文章解释了使用zookeeper实现分布式锁(传送门),本次咱们说一下如何用Redis实现分布式锁和分布限流. Redis有个事务锁,就是如下的 ...
- Redis系列(二)--分布式锁、分布式ID简单实现及思路
分布式锁: Redis可以实现分布式锁,只是讨论Redis的实现思路,而真的实现分布式锁,Zookeeper更加可靠 为什么使用分布式锁: 单机环境下只存在多线程,通过同步操作就可以实现对并发环境的安 ...
- Zookeeper+Curator 分布式锁
本来想着基于zk临时节点,实现一下分布式锁,结果发现有curator框架.PS:原声API真的难用,连递归创建path都没有? 配置curator maven的时候,md配置了好几个小时,最后发现集中 ...
- Zookeeper分布式锁实现Curator十一问
前面我们剖析了Redisson的源码,主要分析了Redisson实现Redis分布式锁的15问,理清了Redisson是如何实现的分布式锁和一些其它的特性.这篇文章就来接着剖析Zookeeper分布式 ...
- 整理分布式锁:业务场景&分布式锁家族&实现原理
1.引入业务场景 业务场景一出现: 因为小T刚接手项目,正在吭哧吭哧对熟悉着代码.部署架构.在看代码过程中发现,下单这块代码可能会出现问题,这可是分布式部署的,如果多个用户同时购买同一个商品,就可能导 ...
- 【zookeeper】Apache curator的使用及zk分布式锁实现
上篇,本篇主要讲Apache开源的curator的使用,有了curator,利用Java对zookeeper的操作变得极度便捷. 其实在学之前我也有个疑虑,我为啥要学curator,撇开涨薪这些外在的 ...
- 分布式锁(Zookeeper实现)
分布式锁 分布式锁,这个主要得益于 ZooKeeper 为我们保证了数据的强一致性.锁服务可以分为两类,一个是 保持独占,另一个是 控制时序. 1. 所谓保持独占,就是所有试图来获取这个锁的客户端,最 ...
- 基于缓存或zookeeper的分布式锁实现
缓存锁 我们常常将缓存作为分布式锁的解决方案,但是却不能单纯的判断某个 key 是否存在 来作为锁的获得依据,因为无论是 exists 和 get 命名都不是线程安全的,都无法保证只有一个线程可以获 ...
随机推荐
- MVC+EF 入门教程(一)
一.前言 本人小白,写这篇博客是为了记录今天一天所学的知识,可能表达不是那么的准确和清楚,欢迎在留言区写下您的建议,欢迎纠错.希望这篇文章对你有所帮助学习 .Net MVC有所帮助.废话不多说了,我们 ...
- Java 集成 速卖通开发.
一.申请成为开发者 申请入口:http://isvhz.aliexpress.com/isv/index.htm 说明文档:http://activities.aliexpress.com/open/ ...
- [数据清洗]-使用 Pandas 清洗“脏”数据
概要 准备工作 检查数据 处理缺失数据 添加默认值 删除不完整的行 删除不完整的列 规范化数据类型 必要的转换 重命名列名 保存结果 更多资源 Pandas 是 Python 中很流行的类库,使用它可 ...
- 《重新定义公司 - Google 是如何运营的》重点摘录
赋能:创意时代的组织原则 未来企业的成功之道,是聚集一批聪明的创意精英,营造合适的氛围和支持环境,充分发挥他们的创造力,快速感知用户需求,愉快地创造响应的产品和服务.未来组织的最重要功能,那就是赋 ...
- ProjectA: 多元非线性回归
https://www.youtube.com/watch?v=n9XycstdPYs&t=907s
- scrapy框架第一章
操作环境:python2.7+scrapy 安装比较简单,网上教程也超多,就不在此赘述. 示例网站:https://www.cnblogs.com/cate/python/ (爬去关于博客园所有pyt ...
- git 分支操作
查看git分支: git fetch刷新git git branch -a 列出所有的分支 git checkout origin/要切换的分支 git branch -r 查看远程分支 git c ...
- C# DataGridView 列的显示顺序
this.dataGridView1.Columns["列名"].DisplayIndex=Convert.ToInt32("你要放置的位置")
- 队列详解及java实现
导读 栈和队列是有操作限制的线性表. 目录 1.队列的概念.特点.存储结构. 2.栈队列的java实现. 概念 队列是一种在一端进行插入,而在另一端进行删除的线性表.1.队列的插入端称为队尾:队列的删 ...
- 一点解决版本冲突的应急思路、怎样在所有jar包文件中搜索冲突的方法?
maven是一个很好的项目管理工具,你可以轻松的定义一个引用,从而达到使用别人写好的库的作用.且maven可以轻松地和jenkins配合,从而使打包部署变得更容易. 但是也因为这样,我们变得更傻瓜了, ...