set 命令用于在 ZooKeeper 中设置/更新某个节点的值。其语法如下:
set [-s] [-v version] path data
参数说明:
-s:可能表示以安静模式执行操作,即不显示额外的信息。
-v version:可能表示指定要更新的数据版本。
path:表示要设置或更新数据的节点路径。
data:表示要设置或更新的数据内容。
(1)设置 /brokers 节点的值,如下:
[zk: localhost:2181(CONNECTED) 16] set /brokers myNewData [zk: localhost:2181(CONNECTED) 17] get /brokers myNewData
(2)设置 /brokers 节点值的同时查看节点状态信息,如下:
[zk: localhost:2181(CONNECTED) 20] set -s /brokers new-data cZxid = 0x23 ctime = Sun Dec 17 13:17:55 CST 2023 mZxid = 0x26 mtime = Sun Dec 17 13:19:17 CST 2023 pZxid = 0x23 cversion = 0 dataVersion = 2 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 8 numChildren = 0 [zk: localhost:2181(CONNECTED) 21] get /brokers new-data
(3)选项 -v 用 CAS 设置数据,可使用 stat 从 dataVersion 查到版本。如下:
# 创建一个节点 [zk: localhost:2181(CONNECTED) 26] create /brokers myData Created /brokers # 获取该节点的数据 [zk: localhost:2181(CONNECTED) 27] get /brokers myData # 设置版本为 0 [zk: localhost:2181(CONNECTED) 28] set -v 0 /brokers my-New-data [zk: localhost:2181(CONNECTED) 29] set -v 0 /brokers my-New-data version No is not valid : /brokers # 设置版本为 1 [zk: localhost:2181(CONNECTED) 30] set -v 1 /brokers my-New-data [zk: localhost:2181(CONNECTED) 31] get /brokers my-New-data
CAS 是“比较并交换”(Compare and Swap)的缩写。它是一种并发控制机制,通常用于多线程编程和分布式系统中,用于实现对共享变量的原子操作。
CAS 操作包含三个参数:内存位置的引用、预期值和新值。它的基本思想是,先比较内存位置的当前值与预期值,如果相等,则将该位置的值更新为新值,否则不做任何操作。
CAS 操作是原子性的,这意味着它在并发环境下可以保证对共享变量的原子操作,避免了使用锁可能带来的性能开销和死锁问题。
在多线程编程中,CAS 可以用于实现无锁数据结构,避免了锁可能带来的性能开销和死锁问题。在分布式系统中,CAS 通常用于实现乐观锁机制,用于协调不同节点对共享资源的访问。