一 zk 实现分布式锁
1.1 zk分布式操作命令
1.指令:
         ls /
         get /zookeeper 
         create /aa "test"
         delete /aa 
         set /aa "test1"
2..znode节点类型:
         永久节点:create /path content
         临时节点:create -e /path content 。只要客户端程序断开链接自动删除
         永久序列化节点:create -s /path content 
         临时序列化节点:create -s -e /path content 
1.2 zk的4种目录树
ookeeper提供一个多层级的节点命名空间(节点称为znode),每个节点都用一个以斜杠(/)分隔的路径表示,而且每个节点都有父节点(根节点除外),非常类似于文件系统。并且每个节点都是唯一的。znode节点有四种类型:
1.PERSISTENT:永久节点。客户端与zookeeper断开连接后,该节点依旧存在
2.EPHEMERAL:临时节点。客户端与zookeeper断开连接后,该节点被删除
3.PERSISTENT_SEQUENTIAL:永久节点、序列化。客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
4.EPHEMERAL_SEQUENTIAL:临时节点、序列化。客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
1.3 实战操作
1.进入zk客户端
./zkCli.sh # 查看zk客户端
2.创建节点命令
[zk: localhost:2181(CONNECTED) 12] get /sz
 test
 [zk: localhost:2181(CONNECTED) 13] set /sz test123
 [zk: localhost:2181(CONNECTED) 14] get /sz
 test123
 [zk: localhost:2181(CONNECTED) 15] 
3.案例
[zk: localhost:2181(CONNECTED) 0] create /aa test  # 创建持久化节点
 Created /aa
 [zk: localhost:2181(CONNECTED) 1] create -s /bb test  # 创建持久序列化节点
 Created /bb0000000001
 [zk: localhost:2181(CONNECTED) 2] create -e /cc test  # 创建临时节点
 Created /cc
 [zk: localhost:2181(CONNECTED) 3] create -e -s /dd test  # 创建临时序列化节点
 Created /dd0000000003
 [zk: localhost:2181(CONNECTED) 4] ls /   # 查看某个节点下的子节点
 [aa, bb0000000001, cc, dd0000000003, zookeeper]
 [zk: localhost:2181(CONNECTED) 5] stat /  # 查看某个节点的状态
 cZxid = 0x0
 ctime = Thu Jan 01 08:00:00 CST 1970
 mZxid = 0x0
 mtime = Thu Jan 01 08:00:00 CST 1970
 pZxid = 0x5
 cversion = 3
 dataVersion = 0
 aclVersion = 0
 ephemeralOwner = 0x0
 dataLength = 0
 numChildren = 5
 [zk: localhost:2181(CONNECTED) 6] get /aa  # 查看某个节点的内容
 test
 [zk: localhost:2181(CONNECTED) 11] delete /aa  # 删除某个节点
 [zk: localhost:2181(CONNECTED) 7] ls /  # 再次查看
 [bb0000000001, cc, dd0000000003, zookeeper]
1.4 zk的监听事件
在读取数据时,我们可以同时对节点设置事件监听,当节点数据或结构变化时,zookeeper会通知客户端。当前zookeeper针对节点的监听有如下四种事件:
   5.节点的事件监听:一次性
         1.节点创建:NodeCreated
             stat -w /xx 
         2.节点删除:NodeDeleted
             stat -w /xx
         3.节点数据变化:NodeDataChanged
             get -w /xx
         4.子节点变化:NodeChildrenChanged
             ls -w /xx
1.客户端
[zk: localhost:2181(CONNECTED) 28] set /teng 1234
 [zk: localhost:2181(CONNECTED) 29] 
 2.客户端2:会提示目录/teng 发生了改变
