カウンターをインクリメントしてから、1 回の呼び出しで値を取得する方法はありますか?
または、2 つの呼び出しを行う唯一の方法ですか?
これは仮想の制限ではなく、Cassandra API の制限です。CQL には、同じ API 呼び出しで値を取得および更新できるものはありません。これには非常に正当な理由があります。
カウンターの値を更新すると、CQL は次のようになります。
UPDATE keyspace.table SET counter = counter + 1 WHERE a = b;
ただし、これにより、一見単純なインクリメントを実行するために Cassandra が経験しなければならない真の分散ロックの複雑さが覆い隠されます。これは、すべてのカウントがlatest
値を更新していること、および同じカウンターの複数のインクリメントが同じ値で終了することを確認するのが非常に難しいためです。
したがって、安全な読み取りを実行できるようになるまでに、十分な数のレプリカによって書き込みが確認されるという保証が必要です。これは非常に簡単に聞こえます。実際には、単一のカウンターのインクリメントで進行するインクリメンタル マージ/比較セット プロセスがあり、詳細はこちら.
読み取り操作は単純です。
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