可以利用ZooKeeper在集群的各个节点之间缓存数据。每个节点都可以得到最新的缓存的数据。Curator提供了三种类型的缓存方式:Path Cache,Node Cache 和Tree Cache。

1.Path Cache

    Path Cache用来监控一个ZNode的子节点。当一个子节点增加,更新,删除时,Path Cache会改变它的状态,会包含最新的子节点,子节点的数据和状态。
1.Path Cache介绍
    Path Cache的主要用途是监控某个节点的子节点,由于Zookeeper原生API的watch监控节点时注册一次只能触发一次,而Path Cache弥补了这个不足,它注册一次可以一直监控触发。
实际使用时会涉及到四个类:
  • PathChildrenCache - Path Cache主要实现类
  • PathChildrenCacheEvent - 监听触发时的事件对象,包含事件相关信息
  • PathChildrenCacheListener - 监听器接口
  • ChildData - 子节点数据封装类
通过下面的构造函数创建Path Cache:
  1. public PathChildrenCache(CuratorFramework client, String path, boolean cacheData)
注意:使用cache,必须调用它的start方法,不用之后调用close方法。其中的cacheData参数用来设置是否缓存节点数据。
start有两个,其中一个可以传入StartMode,用来为初始的cache设置暖场方式(warm):
    1.NORMAL: 初始时为空。
    2.BUILD_INITIAL_CACHE: 在这个方法返回之前调用rebuild()。
    3.POST_INITIALIZED_EVENT: 当Cache初始化数据后发送一个PathChildrenCacheEvent.Type#INITIALIZED事件

PathChildrenCache.getListenable().addListener(PathChildrenCacheListener listener)可以增加listener监听缓存的改变。
getCurrentData()方法返回一个List对象,可以遍历所有的子节点。
2.编写示例程序
  1. public class PathCacheTest
  2. {
  3. private static final String PATH = "/example/cache";
  4. public static void main(String[] args) throws Exception
  5. {
  6. CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", new ExponentialBackoffRetry(1000, 3));
  7. client.start();
  8. PathChildrenCache cache = new PathChildrenCache(client, PATH, true);
  9. cache.start();
  10. PathChildrenCacheListener cacheListener = new PathChildrenCacheListener()
  11. {
  12. @Override
  13. public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception
  14. {
  15. System.out.println("事件类型:" + event.getType());
  16. System.out.println("节点数据:" + event.getData().getPath() + " = " + new String(event.getData().getData()));
  17. }
  18. };
  19. cache.getListenable().addListener(cacheListener);
  20. client.create().forPath("/example/cache/test01", "01".getBytes());
  21. Thread.sleep(10);
  22. client.create().forPath("/example/cache/test02", "02".getBytes());
  23. Thread.sleep(10);
  24. client.setData().forPath("/example/cache/test01", "01_V2".getBytes());
  25. Thread.sleep(10);
  26. for (ChildData data : cache.getCurrentData())
  27. {
  28. System.out.println("getCurrentData:" + data.getPath() + " = " + new String(data.getData()));
  29. }
  30. client.delete().forPath("/example/cache/test01");
  31. Thread.sleep(10);
  32. client.delete().forPath("/example/cache/test02");
  33. Thread.sleep(1000 * 5);
  34. cache.close();
  35. client.close();
  36. System.out.println("OK!");
  37. }
  38. }
注意:如果new PathChildrenCache(client, PATH, true)中的参数cacheData值设置为false,则示例中的event.getData().getData()、data.getData()将返回null,cache将不会缓存节点数据。
注意:示例中的Thread.sleep(10)可以注释,但是注释后事件监听的触发次数会不全,这可能与cache的实现原理有关,不能太过频繁的触发事件!
3.示例程序运行结果
    运行结果控制台:
  1. 事件类型:CHILD_ADDED
  2. 节点数据:/example/cache/test01 = 01
  3. 事件类型:CHILD_ADDED
  4. 节点数据:/example/cache/test02 = 02
  5. 事件类型:CHILD_UPDATED
  6. 节点数据:/example/cache/test01 = 01_V2
  7. getCurrentData:/example/cache/test01 = 01_V2
  8. getCurrentData:/example/cache/test02 = 02
  9. 事件类型:CHILD_REMOVED
  10. 节点数据:/example/cache/test01 = 01_V2
  11. 事件类型:CHILD_REMOVED
  12. 节点数据:/example/cache/test02 = 02
  13. OK!

2.Node Cache

    Path Cache用来监控一个节点的子节点。当节点的数据修改或者删除时,Node Cache能更新它的状态包含最新的改变。
1.Node Cache介绍
Node Cache与Path Cache类似,Node Cache只是监听某一个特定的节点。它涉及到下面的三个类:
  • NodeCache - Node Cache实现类
  • NodeCacheListener - 节点监听器
  • ChildData - 节点数据
注意:使用cache,依然要调用它的start方法,不用之后调用close方法。
getCurrentData()将得到节点当前的状态,通过它的状态可以得到当前的值。
2.编写示例程序
  1. public class NodeCacheExample
  2. {
  3. private static final String PATH = "/example/cache";
  4. public static void main(String[] args) throws Exception
  5. {
  6. CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", new ExponentialBackoffRetry(1000, 3));
  7. client.start();
  8. final NodeCache cache = new NodeCache(client, PATH);
  9. cache.start();
  10. NodeCacheListener listener = new NodeCacheListener()
  11. {
  12. @Override
  13. public void nodeChanged() throws Exception
  14. {
  15. ChildData data = cache.getCurrentData();
  16. if (null != data)
  17. {
  18. System.out.println("节点数据:" + new String(cache.getCurrentData().getData()));
  19. }
  20. else
  21. {
  22. System.out.println("节点被删除!");
  23. }
  24. }
  25. };
  26. cache.getListenable().addListener(listener);
  27. client.create().creatingParentsIfNeeded().forPath(PATH, "01".getBytes());
  28. Thread.sleep(10);
  29. client.setData().forPath(PATH, "02".getBytes());
  30. Thread.sleep(10);
  31. client.delete().deletingChildrenIfNeeded().forPath(PATH);
  32. Thread.sleep(1000 * 2);
  33. cache.close();
  34. client.close();
  35. System.out.println("OK!");
  36. }
  37. }
注意:示例中的Thread.sleep(10)可以注释,但是注释后事件监听的触发次数会不全,这可能与cache的实现原理有关,不能太过频繁的触发事件!
3.示例程序运行结果
    运行结果控制台:
  1. 节点数据:01
  2. 节点数据:02
  3. 节点被删除!
  4. OK!

3.Tree Node

    这种类型的即可以监控节点的状态,还监控节点的子节点的状态,类似上面两种cache的组合。这也就是Tree的概念。它监控整个树中节点的状态。
1.Tree Node介绍
Tree Node可以监控整个树上的所有节点,涉及到下面四个类。
  • TreeCache - Tree Cache实现类
  • TreeCacheListener - 监听器类
  • TreeCacheEvent - 触发的事件类
  • ChildData - 节点数据
注意:使用cache,依然要调用它的start方法,不用之后调用close方法。
getCurrentChildren(path)返回监控节点下的某个节点的直接子节点数据,类型为Map。 而getCurrentData()返回监控节点的数据。
2.编写示例程序
  1. public class TreeCacheExample
  2. {
  3. private static final String PATH = "/example/cache";
  4. public static void main(String[] args) throws Exception
  5. {
  6. CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", new ExponentialBackoffRetry(1000, 3));
  7. client.start();
  8. TreeCache cache = new TreeCache(client, PATH);
  9. cache.start();
  10. TreeCacheListener listener = new TreeCacheListener()
  11. {
  12. @Override
  13. public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception
  14. {
  15. System.out.println("事件类型:" + event.getType() + " | 路径:" + event.getData().getPath());
  16. }
  17. };
  18. cache.getListenable().addListener(listener);
  19. client.create().creatingParentsIfNeeded().forPath("/example/cache/test01/child01");
  20. client.setData().forPath("/example/cache/test01", "12345".getBytes());
  21. client.delete().deletingChildrenIfNeeded().forPath(PATH);
  22. Thread.sleep(1000 * 2);
  23. cache.close();
  24. client.close();
  25. System.out.println("OK!");
  26. }
  27. }
注意:在此示例中没有使用Thread.sleep(10),但是事件触发次数也是正常的。
3.示例程序运行结果
    运行结果控制台:
  1. 事件类型:NODE_ADDED | 路径:/example/cache
  2. 事件类型:NODE_ADDED | 路径:/example/cache/test01
  3. 事件类型:NODE_ADDED | 路径:/example/cache/test01/child01
  4. 事件类型:NODE_UPDATED | 路径:/example/cache/test01
  5. 事件类型:NODE_REMOVED | 路径:/example/cache/test01/child01
  6. 事件类型:NODE_REMOVED | 路径:/example/cache/test01
  7. 事件类型:NODE_REMOVED | 路径:/example/cache
  8. OK!

-------------------------------------------------------------------------------------------------------------------------------

08.Curator缓存的更多相关文章

  1. HTML5学习总结-08 应用缓存(Application Cache)

    一 应用缓存(Application Cache) 1 应用缓存 HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. 应用程序缓存为应用带来三个优势: ...

  2. 08 redis缓存穿透、缓存雪崩、缓存击穿

    Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题无解.如果对数据的一致性要求很 ...

  3. Redis 慢日志

    redis的slowlog是redis用于记录记录慢查询执行时间的日志系统.由于slowlog只保存在内存中,因此slowlog的效率很高,完全不用担心会影响到redis的性能.Slowlog是Red ...

  4. 08.Hibernate的一级缓存-->>Session

    Hibernate提供了两种缓存: 1.一级缓存:自带的不可卸载的,一级缓存的生命周期与Session一致,一级缓存成为Session级别的缓存 2.二级缓存:默认没有开启,需要手动配置才可以使用,二 ...

  5. PowerDotNet平台化软件架构设计与实现系列(08):缓存平台

    几乎所有后端应用都会或多或少用到缓存,尤其是分布式缓存服务,以及和本地缓存构造的二级缓存.根据我们一贯的节约代码的风格,为了复用的目标,抽象出缓存平台,进行缓存管理. 考虑到很多公司都会自己造或者直接 ...

  6. SpringBoot2.0 基础案例(08):集成Redis数据库,实现缓存管理

    一.Redis简介 Spring Boot中除了对常用的关系型数据库提供了优秀的自动化支持之外,对于很多NoSQL数据库一样提供了自动化配置的支持,包括:Redis, MongoDB, Elastic ...

  7. Apache Curator获得真正的

    Apache Curator获得真正的 Curator它是Netflix一家公司来源Zookeeper顾客,与Zookeeper相比于提供本地客户端,Curator的抽象层次更高,简化了Zookeep ...

  8. Apache Curator入门实战

    Apache Curator入门实战 Curator是Netflix公司开源的一个Zookeeper客户端,与Zookeeper提供的原生客户端相比,Curator的抽象层次更高,简化了Zookeep ...

  9. Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager

    Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存操作所以速度飞快,常见用法是存用户token.短信验证码等 官网显示Redis本身并没有Wind ...

随机推荐

  1. gsoap简介

    gSoap是什么? 请进 官方网站 http://genivia.com/index.html 这里更直接 http://www.cs.fsu.edu/~engelen/soap.html 英语水平很 ...

  2. MySQL 插入数据时,中文乱码问题的解决

    当向 MySQL 数据库插入一条带有中文的数据形如 insert into employee values(null,'张三','female','1995-10-08','2015-11-12',' ...

  3. jquery -- jquery控制只能输入数字和小数点

    控制文本框只能输入数字是一个很常见的需求,比如电话号码的输入.数量的输入等,这时候就需要我们控制文本框只能输入数字.在用js控制之后在英文输入法的状态下去敲击键盘上的非数字键是输不进去的,然而当你转到 ...

  4. android中文api(79)——Gallery

    前言 本章内容是 android.widget.Gallery,版本为Android 2.3 r1,翻译来自"henly.zhang",欢迎大家访问他的博客:http://www. ...

  5. eclipse下载,安装,JDk环境配置教程(多图)

    第一步:下载eclipse,并安装. 下载链接:http://www.eclipse.org/downloads/ 点击 Download Packages; 根据自己的系统选择32位还是64位的,点 ...

  6. Java 基本概念:jvm、jdk、jre、jse

    jvm 是java虚拟机,将java的class字节码文件翻译成二进制可执行程序.jdk 是java的开发包 Javasdk, java的开发工具,包含SUN公司提供的javaAPI,将java源码编 ...

  7. jquery-包裹元素

    1.wrap方法 在每个匹配的元素外层包上一个html元素 参数类型说明: 1)html字符串 $('p').wrap('<div></div>'); 传入的html标签也可以 ...

  8. 搜集的一些酷炫的金属色 ,RGB值 和大家分享一下

    开发iOS程序过程中会使用到RGB,要注意每个RGB值都要除以 255.0 ,注意: ' .0 ' 不能省!! 一下是本人搜集的一些酷炫金属色的RGB值:   黄金 242,192,86 石墨 87, ...

  9. 如何用MathType编辑集合运算符号

    在涉及到集合的运算中,有交并且几种常见的运算,这在数学问题中也是很常见的公式.在用MathType编辑这些符号时,该怎么编辑呢?下面就介绍MathType集合运算符号的编辑方法. 具体操作过程如下: ...

  10. sftp,get命令使用*通配符的方式获取批量的文件

    需求描述: 今天在使用sftp进行get文件的时候,有很多文件名类似的文件,以为还是需要一个一个get 后来发现get也可以使用通配符的方式进行匹配获取多个文件,在此记录下 操作过程: 1.通过sft ...