2016-10-20 2 views
1

Есть ли способ увеличить счетчик, а затем вернуть значение за один раз?Приращение и получение значения счетчика

Или это единственный способ сделать 2 звонка?

+0

Вы хотите иметь значение перед приращением, после приращения или до и после? –

+0

@EliSadoff Я хочу значение после приращения. –

+0

Поскольку scala не имеет оператора '++', вы должны увеличить счетчик, а затем вернуть значение. –

ответ

2

Это не фантомное ограничение, а API Cassandra, в 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 
Смежные вопросы