Есть ли способ увеличить счетчик, а затем вернуть значение за один раз?Приращение и получение значения счетчика
Или это единственный способ сделать 2 звонка?
Есть ли способ увеличить счетчик, а затем вернуть значение за один раз?Приращение и получение значения счетчика
Или это единственный способ сделать 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
Вы хотите иметь значение перед приращением, после приращения или до и после? –
@EliSadoff Я хочу значение после приращения. –
Поскольку scala не имеет оператора '++', вы должны увеличить счетчик, а затем вернуть значение. –