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 命名都不是线程安全的,都无法保证只有一个线程可以获 ...
随机推荐
- svn协同开发下的dll版本管理最佳实践
作为一名开发人员,常常碰到的一个问题是,当使用svn签出一份最新代码时,经常不能一次编译通过,导致花费大量时间去解决编译问题,这里碰到的问题一般可以分为三类: 1. 由于提交代码的开发人员失误,忘记提 ...
- 在Office Add-in中实现单点登陆(SSO)
作者:陈希章 发表于 2017年12月27日 这篇文章经过多次修改,终于在今天晚上写完了,演示用的范例代码也终于跑通了.因为这个SSO的功能目前只是Preview的状态,所以本篇文章严格参考了官方的文 ...
- Bootstrap学习笔记(一)
用Laravel编写了一段时间程序,选择了bootstrap作为前段框架,现在已经有一段时间了,抽空总结一下: bootstrap是一个前端框架,所谓框架就是为满足特定需要在特定环境下提供的一 ...
- iOS 友盟推送,应用内推送启动图推送闪动黑屏,插屏推送方法报错
以前都是用的极光推送,应公司需求要求使用友盟推送,为了以后是有分享都适用,,, 友盟推送文档,下载demo 感觉比极光用着要简单顺手 一切就绪后,开始发送消息测试,,,,,搞了半天没有发过来消息 原来 ...
- 如何在阿里云linux上部署java项目
前2天把git练了下,敲了很多命令,也借助图形界面增强自己的理解,乘着余热把linux在熟悉下.然后想起以前婷主有让我帮忙搭建的阿里云服务器,所以就想自己试着在阿里云的linux上搭建自己的jav ...
- bzoj 2733: [HNOI2012]永无乡
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- 虚拟机创建流程中neutron代码分析(三)
前言: 当neutron-server创建了port信息,将port信息写入数据库中.流程返回到nova服务端,接着nova创建的流程继续走.在计算节点中neutron-agent同样要完成很多的工作 ...
- ES6 函数的扩展1
1. 函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,为了避免这个问题,通常需要先判断一下参数y是否被赋值,如果没有,再等于默认值. ES6允许为函数的参数设置默认值,即直接 ...
- tar --打包和压缩
tar 参考链接 作用:为linux的文件和目录创建档案,也可以在档案中改变文件,或者向档案中加入新的文件即用来压缩和解压文件.tar本身不具有压缩功能.他是调用压缩功能实现的 语法:tar[必要参 ...
- Webpack 2 视频教程 008 - WDS 端口号等配置相关
原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...