2012-01-27 19 views

回答

7

Cassandra thrift API中没有单个“incrementAndGet”操作。

卡桑德拉的计数器最终是一致的和非原子的。易碎的ConsistencyLevel.ALL操作需要获得“保证被更新”的计数器值,即执行一致的读取。 ConsistencyLevel.QUORUM不够(如在计数器设计文档中指定的:https://issues.apache.org/jira/secure/attachment/12459754/Partitionedcountersdesigndoc.pdf)。

要实现incrementAndGet方法看起来一致的,你可能想在第一阅读计数器的值,然后发出增量突变,和返回(读值+增量)。例如,如果之前的计数器值为10到20(在不同的副本上),并且一个添加了50,那么read-before-increment将返回60或70.并且增量后读取仍可能返回10或20.

+0

非常有趣的方法,谢谢! – tom 2012-01-29 04:30:17

+0

这将如何解决计数器不是原子的问题。例如,如果我再做一次(增量和读取)操作,那么我仍然可以获得旧值: 调用1: 计数器值:1 读取(获得1),增量1(发出调用),返回2 调用2 :(最后一个增量调用没有传播到所有节点) read(gets 1),increment 1(call issued),return 2 – 2013-03-27 16:57:47

+0

@AlastorMoody:正如我所说的,这种方法允许实现*看起来*一致的计数器。由于cassandra计数器的性质最终是一致的,因此只能以对性能产生重大影响的价格(即使用分布式锁)使计数器原子化。如果你真的需要原子计数器 - 除了Cassandra之外还有很多工具(如Redis) – Wildfire 2013-03-28 17:33:51

0

要做到这一点的唯一方法就是查询它。 Cassandra中没有增量再读取功能。