这是checkandput api。 public boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier, byte[] value, Put put)
如果我的理解是正确的 row
参数可以不同于 put
. 但这为什么有用呢?我想 checkAndPut
就像 CompareAndSwap(CAS)
在硬件架构中找到的操作。 CAS
正在比较和设置单个变量。但是 checkAndPut
似乎支持不同行上的操作。这有用吗?或者我们需要保证 row
实际上与 put
?
1条答案
按热度按时间vohkndzv1#
checkandput()是cas的hbase变体,现在不推荐使用它,应该改用checkandmutate。正如javadoc中指定的那样,api原子地检查行/族/限定符值是否与期望值匹配。如果有,就加上看跌期权。如果传递的值为null,则检查是否缺少列(即:不存在)。
让我们以列族为“cf1”的表“t1”为例,了解以下场景中的行为-
创建要插入的行
情况1-表中不存在行、列族或列
结果-插入新记录,res=true
案例2-重新插入案例1中插入的相同记录
结果-由于列已存在,因此不会发生上插,res=false
案例3-添加一个新的行键r2,cf1:q1,而put仍然设置为rowkey=r1。
结果-没有upsert发生,我们得到一个异常-“action的getrow必须与传递的行匹配”,这意味着checkandput中设置的行键应该与put中设置的行键相同,并且这个api正在按顺序并对照put中指定的值检查行、列族和列限定符是否存在
情况4-将新列族cf2添加到行键r1和列q1,而put仍然设置为rowkey=r1,列族cf1。
结果-没有发生上插,我们得到一个异常-“列族cf2不存在于区域t1,,1524474825488.a1f7efa76e78f38d64f95b63222cbfa8中。在表‘t1’中……”
案例5-我们不是在checkandput()中检查q1,而是在checkandput()中检查q2的存在
结果-在这里,api将检查列q2是否存在(在我们的例子中不存在),因此同一列q1将得到更新,因为put仍然设置为值v1,只有时间戳/q1的版本将更改,res=true
案例6-在前面的所有示例中,第4个参数设置为null,这里我们指定了实际值
result-checkandput将为q1指定的值与put进行比较,因为它与insert发生时的值相等,res=true
案例3和案例4回答了问题的最后一部分。
从可用性的Angular 来看,我认为这个api在同一行/列上可能发生大量并发更新的场景中非常有用,为了避免任何冲突和过时的数据,我们先读验证,然后写,就像occ-https://en.wikipedia.org/wiki/optimistic_concurrency_control#occ_phases
要在多个行/列上执行upserts,应使用checkandmutate[检查-hbase checkandput和checkandmutate之间有什么区别?]
希望这有帮助。