增加并获得计数器的价值

时间:2016-10-20 20:44:08

标签: scala cassandra phantom-dsl

有没有办法增加一个计数器,然后在一次调用中恢复该值?

或者是进行2次通话的唯一方法?

1 个答案:

答案 0 :(得分:2)

这不是幻像限制,而是Cassandra API,CQL中没有任何内容允许您在同一API调用中检索和更新值,并且有一个非常好的理由。

当您更新计数器的值时,CQL如下所示:

UPDATE keyspace.table SET counter = counter + 1 WHERE a = b;

然而,这掩盖了Cassandra必须经历的真正的分布式锁定复杂性,以执行看似简单的增量。这是因为很难确保每个计数都更新latest值,并且同一个计数器的多个增量将以相同的值结束。

因此,您需要保证写入被足够的副本确认,之后您可以执行安全读取,这使得声音非常简单。实际上,有一个增量合并/比较和设置过程,在一个计数器增量中继续,更详细here

读取操作很简单:

SELECT * FROM keyspace.table WHERE a = b;

如果您认为通过这样做可以节省大量网络或复杂性,那么除非读取/写入量巨大,否则您可能不会这样做。简而言之,这是一个快乐的想法,但我不会打扰。

for {
  inc <- database.table.update.where(_.a = b).modify(_.counter increment 1).future()
  value <- database.table.select(_.counter).where(_.a = b).one()
} yield value