10

キー値ストア内のキーのポリシーを定義しようとしています (Redis を使用しています)。キースペースは次のようにする必要があります。

  • 分割可能 (より多くのサーバーを導入し、それらの間のキースペースを広げることができます)

  • 名前空間(たとえば、ドメインまたは関連する概念によって、キーを論理的に「グループ化」するメカニズムが必要です)

  • 効率的(できるだけ多くのデータを許可するために、DB 内のキー用のスペースをできるだけ少なくするようにしてください)

  • 可能な限り衝突の少ない(2 つの異なるオブジェクトのキーが等しくならないようにする)


私が検討した2つの代替案は次のとおりです。

  1. いくつかの文字 ( など) で区切られた名前空間のプレフィックスを使用しますhuman_resources:person:<some_id>。これの利点は、非常にスケーラブルで理解しやすいことです。マイナス面は、区切り記号に応じて競合が発生する可能性があり (その中idに文字:が含まれているとどうなるか?)、サイズの効率性が高くなる可能性があります (ネストされた名前空間が多すぎると、非常に長いキーが作成される可能性があります)。

  2. 名前空間を格納するには、何らかのデータ構造 (Ordered Set や Hash など) を使用します。これの主な欠点は、名前空間を格納するための構造が単一のデータベースにある必要があるため、「分割可能性」が失われることです。

質問: シャード設定でキースペースを管理するには、どのような方法がよいでしょうか? これらの代替案のいずれかを使用する必要がありますか、それとも考慮していない他のより良いパターンがありますか?

どうもありがとう!

4

1 に答える 1

12

Redis の世界で一般的に受け入れられている規則は、オプション 1 です。つまり、コロンなどの文字で区切られた名前空間です。つまり、ほとんどの場合、名前空間は 1 レベルの深さです。例:person:12321の代わりにhuman_resources:person:12321.

これは、あなたが設定した 4 つのガイドラインでどのように機能しますか?

シャード可能- このアプローチはシャード可能です。各キーは、設定方法に応じて、異なるシャードまたは同じシャードに入ることができます。

名前空間衝突を回避する方法としての名前空間は、このアプローチで機能します。ただし、キーをグループ化する方法としての名前空間はうまくいきません。一般に、データをグループ化する方法としてキーを使用することはお勧めできません。たとえば、ある人が別の部署に移動した場合はどうなるでしょうか。キーを変更すると、すべての参照を更新する必要があり、これは面倒です。

オブジェクトのキーが変更されないようにすることが最善です。グループ化は、別のインデックスを作成することにより、外部で処理できます。

たとえば、部門別、給与範囲別、場所別に人々をグループ化するとします。これがあなたのやり方です -

  1. 個々の人はキーを使用して個別のハッシュに入るpersons:12321
  2. 各グループを次のように作成しますset- 例: persons_by:department- このセット内の各人物の数値識別子のみを保存します。たとえば、[12321、43432]。このようにして、Redis の整数セットの利点を得ることができます

効率的上で説明した方法は、メモリに関して非常に効率的です。さらにメモリを節約するために、アプリケーション側でキーをさらに圧縮できます。たとえば、p:12321の代わりに保存できますpersons:12321。プロファイリングによって、そのようなメモリ節約が必要であると判断した場合にのみ、これを行う必要があります。一般的に、それはコストの価値がありません。

Collision Freeこれはアプリケーションによって異なります。各 User または Person には、変更されない主キーが必要です。これを Redis キーで使用すると、衝突が発生しなくなります。

あなたはこのアプローチの 2 つの問題について言及しましたが、私はそれらに対処しようとします。

ID にコロンがある場合はどうなりますか?

もちろん可能ですが、アプリケーションの設計ではそれを防ぐ必要があります。複数のシステムで使用されるため、識別子に特殊文字を使用できないようにすることをお勧めします。たとえば、識別子は URL の一部である可能性が非常に高く、コロンは URL でも予約文字です。

識別子に特殊文字を使用できるようにする必要がある場合は、特殊文字をエンコードする小さなラッパーをコードに記述する必要があります。URL エンコーディングは、これを完全に処理できます。

サイズ効率

長いキーにはコストがかかりますが、それほど多くはありません。一般に、キーよりも値のデータ サイズに注意する必要があります。キーがメモリを消費しすぎていると思われる場合は、redis-rdb-tools などのツールを使用してデータベースをプロファイリングします。

キーのサイズが問題であり、メモリを節約したい場合は、エイリアスを使用してキーを書き換える小さなラッパーを作成できます。

于 2013-11-05T08:24:13.910 に答える