【问题标题】:Increment and get value of counter递增并获取计数器的值
【发布时间】:2017-03-03 00:43:02
【问题描述】:

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

或者是打2个电话的唯一方法?

【问题讨论】:

  • 你想要增量前的值,增量后的值,还是前后都有?
  • @EliSadoff 我想要增量后的值。
  • 由于 scala 没有 ++ 运算符,因此您必须递增计数器然后返回值。

标签: scala cassandra phantom-dsl


【解决方案1】:

这不是幻像限制,而是 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

【讨论】:

    猜你喜欢
    • 2012-03-14
    • 1970-01-01
    • 2023-02-19
    • 2023-03-16
    • 2013-08-12
    • 2011-11-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多