谚该命令用先读出HBase单元就可以改变存储其中的值。数据操作发生在HBase服务器上,而不是在你的客户端,所以速度快。当其他客户端也在访问同—个单元时,这样避免了出现紊乱状态。你可以把ICV(Increment Column Value)等同于Java的AtomicLong.addAndGet()方法。递增值可以是任何Java Long类型值,无论正负。我们将在下一节深入讨论原子性操作。
也请注意这个数据不是存储在twits表而是users表中。存在users表的原因是不希望这个信息成为扫描的一部分。存在twits表里会让常用的访问模式很不方便。
就像Java的原子类族,HTableInterface也提供checkAndPut()和checkAndDelete()方法。它们可以在维持原子语义的同时提供更精细地控制。你可以用checkAndPut()来实现incrementColumnValue()方法:
Get g=new Get(Bytes.toBytes("TheRealMT"));
Result r=usersTable.get(g);
long curVal=Bytes.toLong(
r.getColumnLatest(
Bytes.toBytes("info"),
Bytes.toBytes("tweet—count")).getValue());
long incVal=curVal+1;
Put P=new Put(Bytes.toBytes("TheRealMT"));
P.add(
Bytes.toBytes("info"),
Bytes.toBytes("tweet.count"),
Bytes.toBytes(incVal));
usersTable.checkAndPut(
Bytes.toBytes("TheRealMT"),
Bytes.toBytes("info"),
Bytes.toBytes("tweet count"),
Bytes.toBytes(curVal),
P);
该实现有点长,但可以试试。使用checkAndDelete()的方式与此类似。
按照和前面相同的方式,你可以轻松地新建TwitsTool表。模型、DAO和命令行实现和前面users表的情况类似。本书附带的源代码提供了一个实现。
2.8 ACID语义
如果使用过数据库系统,你会听说过各种数据库系统提供的ACID语义。ACID是当你搭建使用数据库系统做存储的应用系统时需要掌握的一组要素。当应用系统访问承载它的数据库时,遵循这些要素可以使应用系统的行为更加合理。为简单起见,让我们再次定义ACID。记住,ACID不同于之前我们简要介绍过的CAP。
展开