2013-10-09 9 views
8

キーバリューストア(私たちはレディスを使用しています)のキーに関するいくつかのポリシーを定義しようとしています。鍵空間は次のようになります。Key-Valueストアのキーを管理する良い方法は何ですか?

  • Shardable(複数のサーバーを導入し、それらの間の鍵空間を広げることができます)

  • の名前空間(一緒に論理的に「グループ」のキーにはいくつかのメカニズムがあるはず、

  • 効率的な(できるだけDBのスペースをできるだけ少なくして、DBのスペースをできるだけ小さくしてください可能な限り)衝突レスできるだけ

  • (等しくなるように2つの異なるオブジェクトのキーを避けるため)、私が検討している


二つの選択肢これらは次のとおりです。

  1. 名前空間に接頭辞を使用して、一部の文字(たとえば、human_resources:person:<some_id>など)で区切ります。これは、拡張性が高く、理解しやすいという点です。欠点は、セパレータ(おそらくに文字が:の場合)とサイズ効率(おそらくネストされた名前空間が非常に長いキーを作成する可能性があります)によって競合が起こる可能性があります。

  2. 名前空間を格納するために、いくつかのデータ構造(順序付きセットまたはハッシュなど)を使用します。これに対する主な欠点は、名前空間を格納する構造体が単一のデータベースに存在する必要があるため、 "断片化可能性"の損失です。

質問:何シャードセットアップで鍵空間を管理するための良い方法でしょうか?これらの選択肢の1つを使用すべきか、それとも考慮していない他のより良いパターンがありますか?

ありがとうございました!

答えて

8

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

設定した4つのガイドラインはどのように機能しますか?

シャード可能 - この方法は断片的です。どのように設定するかによって、各キーは異なるシャードまたは同じシャードに入ることができます。

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

オブジェクトのキーが決して変更されないようにするには最高の方法です。グループ化は、個別の索引を作成することによって外部的に処理できます。

たとえば、部門別、給与額別、地域別にグループ化するとします。ここではあなたがそれを行うだろう方法です - 例えば -

  1. 個々の人々は、キーpersons:12321
  2. によって各グループのsetを作成して、別のハッシュに行く:persons_by:department - とだけこの中でそれぞれの人のための数値識別子を保存しますセット。例えば、[12321、43432]。このように、あなたは

方法は、上記で説明し効率的なが賢明かなり効率的なメモリであるRedisの整数設定の利点を取得します。メモリをさらに節約するために、アプリケーション側でキーをさらに圧縮することができます。たとえば、persons:12321の代わりにp:12321を格納することができます。プロファイリングを介して、このようなメモリ節約が必要であると判断した場合にのみ、これを行う必要があります。一般的に、それはコストの価値がありません。

コリジョンフリーこれはアプリケーションによって異なります。各ユーザーまたは個人には、決して変更されない主キーが必要です。 Redisキーでこれを使用すると、衝突は発生しません。

あなたは、このアプローチには二つの問題に言及した、と私は彼らにidがコロンを持っている場合はどう

に対処しようとするのだろうか?

もちろん可能ですが、アプリケーションの設計によって妨げられるはずです。複数のシステムで使用されるため、識別子に特殊文字を使用しないことをお勧めします。たとえば、識別子はURLの一部である可能性が高く、コロンはURLの場合でも予約文字です。

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

サイズ効率

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

キーサイズが問題であると判断してメモリを保存する場合は、エイリアスを使用してキーを書き換える小さなラッパーを作成できます。

+0

素敵な答えです。時間をかけてこの問題に取り組んでいただき、ありがとうございます。以前はあなたのために「バウンティ」ボタンをクリックしなかったことをお詫びしますが、これを初めて使用したのです。ありがとう! –

関連する問題