Redis のデータ型とコマンド

最終更新: 2024-01-02 17:43:06 +0800 +0800
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

Redis は各キーを 1 つのデータ型に関連付けます。誤った型のキーに対して発行されたコマンドは失敗するため、キーの命名と値の所有権によってデータモデルを明示すべきです。

Redis は各コマンドをサーバースレッド上でアトミックに実行します。したがって、INCR、HSET、SADD、ZADD などの単一コマンドは 1 キーの状態変更に対して安全ですが、複数段階の読み取り・変更・書き込みシーケンスを 1 単位として動作させる必要がある場合は、MULTI/EXEC、WATCH、または Lua が必要です。

キーのライフサイクル #

DEL は値を同期的に回収するため、大きな集約値では処理をブロックする可能性があります。UNLINK はキーを切り離し、Redis がメモリーを非同期に回収できるようにします。EXPIRE、PEXPIRE、TTL、PTTL で有効期限を設定および確認します。TTL は、有効期限のないキーに対して -1、存在しないキーに対して -2 を返します。

本番規模のキースペースに対して KEYS * を使用してはなりません。1 つのコマンドでキースペース全体を走査するためです。代わりに SCAN で反復します。

redis
SCAN 0 MATCH user:* COUNT 1000

返されたカーソルが 0 になるまで続けます。スキャンは重複を返す場合があり、反復中に作成または削除されたキーを見逃す場合もあります。一意の結果を必要とする呼び出し側は、重複を除去する必要があります。

主要な型 #

  • 文字列は GET、SET、アトミックな INCRBY、およびバイナリーセーフな値をサポートします。
  • リストは、キューや作業ストリームに使用する、順序付きで左右の端からアクセスするコレクションです。LPUSH と RPUSH は先頭または末尾に追加します。LPOP と RPOP は空のリストに対して nil を返し、最後の要素がなくなるとキーを削除します。BLPOP と BRPOP は、列挙したキーのいずれかが空でなくなるまでブロックします。LRANGE は両端を含み、末尾からの負のインデックスを受け付けます。無制限の範囲は非常に大きなペイロードを返す可能性があります。RPOPLPUSH と BRPOPLPUSH は、1 つの末尾要素を別のリストへアトミックに移動します。
  • 集合は、一意のメンバーを保持し、ハッシュテーブルによる包含検査を提供します。SADD、SREM、SCARD、SISMEMBER、SMEMBERS、SPOP、SRANDMEMBER を使用します。SINTER、SUNION、SDIFF などの集合演算コマンドは、入力を変更せずに読み取ります。*STORE 形式は出力先集合をアトミックに置き換えます。
  • ソート済み集合は、一意の各メンバーを浮動小数点スコアに関連付けます。ZADD はメンバーをアトミックに追加または更新するため、同じメンバーを繰り返すと重複を作らず、以前のスコアを置き換えます。順序付きルックアップには ZRANGE、ZREVRANGE、ZRANK、ZREVRANK、およびスコア範囲コマンドを使用し、削除には ZREM または ZREMRANGEBYRANK/ZREMRANGEBYSCORE を使用します。
  • ハッシュは、1 つのキーの下にフィールドと値のペアをまとめます。HSET はフィールドをアトミックに作成または更新します。HGET、HMGET、HDEL、HINCRBY、HGETALL は、ネストされたオブジェクトではなく名前付きフィールドを操作します。HGETALL は結果が大きくなる可能性があるため、少数のフィールドだけが必要な場合は対象を絞った読み取りを優先してください。
  • ストリームは、順序付き ID の下にフィールドと値のエントリーを追加します。XADD はエントリーを書き込み、XRANGE は ID 範囲を読み取り、XREAD はカーソルより後のエントリーを待ちます。コンシューマーグループは XREADGROUP でエントリーを分配します。コンシューマーは完了した作業を XACK で確認し、放棄された保留中エントリーを意図的に回収する必要があります。ストリームは永続的なデータ構造であり、一時的な Pub/Sub 配信ではありません。

HGETALL、SMEMBERS、および無制限の LRANGE はすべての要素を返すため、大きなレスポンスを生成する可能性があります。リクエスト処理では、カーソルベースのハッシュおよび集合のスキャン、または範囲を制限した読み取りを使用してください。

MULTI はコマンドをキューへ入れ、EXEC は別のクライアントによる割り込みなしで実行しますが、Redis のトランザクションは SQL 形式のロールバックを提供しません。キューに入れた 1 つのコマンドで実行時エラーが発生しても、同じ EXEC 内で成功したコマンドは取り消されません。WATCH は楽観的な競合検出を追加します。Lua スクリプトと Redis Functions は他のコマンドに対してアトミックに実行されます。長時間の実行はサーバーの進行をブロックするため、処理を有界に保つ必要があります。

確率的カウント #

HyperLogLog 値は PFADD で観測値を受け取り、PFCOUNT でカーディナリティを推定します。Redis の文書では、標準誤差は 1 パーセント未満、密な表現は最大 12 KiB とされており、正確性とメンバー列挙を犠牲にしてメモリーを有界にします。PFMERGE は互換性のある観測値を結合します。正確なメンバー一覧が必要な場合は集合を使用し、近似カウントがプロダクトの契約を満たす場合にのみ HyperLogLog を使用してください。

参考資料 #

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)