OrderPreservingPartitioner が使用され、行キーが厳密に昇順であると仮定すると、Cassandra クライアントを使用して最近追加された行の行キーを取得する簡単な方法はありますか? get_range_slices クエリを実行してすべての行をフェッチし、最後まで繰り返して最後の行キーを見つけることができることを認識しています。しかし、それは時間のかかる操作だと思います。
3 に答える
昇順でOPPが使用されていても、最後に挿入された行キーを取得することはできないと思います。
- 単純な解決策の 1 つは、最後に挿入されたキーをファイルに保存するか、そのような手段です。これについてカサンドラを考えないでください:P
- cassandra に固執したい場合は、元の CF (OCF) のすべての挿入された行キーを一時的な CF (TCF) に列として保存することをお勧めします。TCFがOCF
comparator
と同じであることを確認してくださいkey_validation_class
解決策 2 では、OCF の最後に挿入された row_key を TCF の行の最後の列として保持します。列で逆範囲スライスを使用して、最後から最初のものを取得できます;)
SELECT FIRST 1 REVERSED * from TCF where KEY='yourkey'
列の有効期限プロパティを使用してTemporary_CFの行のサイズを制御でき、この方法でデータをモデル化すると、最後にn個のrow_keysを挿入するオプションも提供できます。
SELECT FIRST N REVERSED * from TCF where KEY='yourkey'
使用パターン: 最後に追加された行を頻繁にロードする必要があります
実装: シリアル化の前に RowKey を「反転」します。OrderPreservingPartitioner を使用します。「timestamp」を RowKey として使用します。
たとえば、RowKey は長い数値です (タイムスタンプを表します)。次に、タイムスタンプのシリアル化に reverted (Long.MAX_VALUE - タイムスタンプ) を使用します。最初の行が最後に挿入される行になります。
ノードのネットワーク全体でタイムスタンプの詳細の下にある最後の行を絶対に知る必要がある場合...何も考えられません。
ただし、cassandra は競合するセル (行 + 列) の更新を最新のタイムスタンプで解決するため、すべての挿入に対して、そのテーブルに対応する単一の行の単一の列も更新し、そのセルを ALL でクエリします。列ファミリ/テーブルごとに異なる行を使用して、1 つの行の更新がボトルネックになりすぎないようにすることをお勧めします。
競合する同じタイムスタンプの更新が 2 つある場合は、おそらくその時点で哲学的な問題に直面することになります。ネットワーク化されたシーケンスジェネレーターのスローダウンポイントが必要でない限り、それは最悪です。
一貫性を ALL から QUORUM または ONE に落とすと、必要な結果の正確さに応じて、行の挿入が高速化される可能性があります。