博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Zookeeper 安全的修改数据
阅读量:4110 次
发布时间:2019-05-25

本文共 1927 字,大约阅读时间需要 6 分钟。

Zookeeper 安全的修改数据

之前有文章写了Zookeeper 通过节点是否存在进行互斥,实现悲观锁

这次来说说如何安全的修改数据。

原理

ZNode中 Stat结构:

  • cZxid:这是导致创建znode更改的事务ID。
  • mZxid:这是最后修改znode更改的事务ID。
  • pZxid:这是用于添加或删除子节点的znode更改的事务ID。
  • ctime:(Create TIme) 表示从1970-01-01T00:00:00Z开始以毫秒为单位的znode创建时间。
  • mtime:(Modify Time) 表示从1970-01-01T00:00:00Z开始以毫秒为单位的znode最近修改>*时间。
  • dataVersion:表示对该znode的数据所做的更改次数。
  • cversion:这表示对此znode的子节点进行的更改次数。
  • aclVersion:表示对此znode的ACL进行更改的次数。
  • ephemeralOwner:如果znode是ephemeral类型节点,则这是znode所有者的 session ID。 如果znode不是ephemeral节点,则该字段设置为零。
  • dataLength:这是znode数据字段的长度。
  • numChildren:这表示znode的子节点的数量。

原理就是先获取数据并且获取到Stat,然后尝试修改数据时传入Stat的dataVersion,如果version不同 就会抛出 BadVersion 异常

curator 例子

  • 错误的修改方式:
CuratorFramework client = CuratorFrameworkFactory.builder()                .connectString("192.168.0.111:2181")                .sessionTimeoutMs(10000).retryPolicy(new RetryNTimes(3, 1000)).build();                .namespace("test").build();                        client.start();		try {
byte[] data = "我是消息".getBytes(); client.create().creatingParentsIfNeeded() .withMode(CreateMode.EPHEMERAL) .forPath("/shepi", data); } catch (Exception isIgnored){
} //我们的本意是,如果这个节点的内容为 我是消息,那么就可以修改 byte[] data = client.getData().forPath("/shepi"); if (String.valueOf(data).equals("我是消息")){
client.setData().forPath("/shepi", "改掉了".getBytes()); }

上面的例子有个问题,就是在判断data内容是否相同时,如果其他session手动修改了数据呢?

  • 正确的例子
  • 通过Stat中的版本号,来尝试修改,如果修改失败,抛出 BadVersion 异常
Stat stat = new Stat();	for(;;){
byte[] data = client.getData().storingStatIn(stat).forPath("/shepi"); if (String.valueOf(data).equals("我是消息")){
try{
client.setData().withVersion(stat.getVersion()).forPath("/shepi", "改掉了".getBytes()); return; //没出异常说明修改成功直接返回 } catch (KeeperException.BadVersionException ignored){
//进行重新尝试 System.out.println("修改失败了"); } }else{
System.out.println("已经被别人修改过了"); return; } }

转载地址:http://cxlsi.baihongyu.com/

你可能感兴趣的文章
手绘VS码绘(一):静态图绘制(码绘使用P5.js)
查看>>
手绘VS码绘(二):动态图绘制(码绘使用Processing)
查看>>
基于P5.js的“绘画系统”
查看>>
《达芬奇的人生密码》观后感
查看>>
论文翻译:《一个包容性设计的具体例子:聋人导向可访问性》
查看>>
基于“分形”编写的交互应用
查看>>
《融入动画技术的交互应用》主题博文推荐
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day12 集合
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
Day_15JavaSE 异常
查看>>
异常 Java学习Day_15
查看>>
JavaSE_day_03 方法
查看>>
day-03JavaSE_循环
查看>>
Mysql初始化的命令
查看>>