Redisの世界で一般に受け入れられている慣例は、オプション1です。つまり、コロンなどの文字で区切られた名前空間です。つまり、名前空間はほとんど常に1レベル深いです。たとえば、human_resources:person:12321
の代わりにperson:12321
とします。
設定した4つのガイドラインはどのように機能しますか?
シャード可能 - この方法は断片的です。どのように設定するかによって、各キーは異なるシャードまたは同じシャードに入ることができます。
名前空間名前空間は、このアプローチでは衝突を回避する方法として機能します。ただし、キーをグループ化するための名前空間は機能しません。一般に、データをグループ化する方法としてキーを使用することは悪い考えです。たとえば、人が部署から部署に移動するとどうなりますか?キーを変更すると、すべての参照を更新する必要があります - それは難しくなります。
オブジェクトのキーが決して変更されないようにするには最高の方法です。グループ化は、個別の索引を作成することによって外部的に処理できます。
たとえば、部門別、給与額別、地域別にグループ化するとします。ここではあなたがそれを行うだろう方法です - 例えば -
- 個々の人々は、キー
persons:12321
- によって各グループの
set
を作成して、別のハッシュに行く:persons_by:department
- とだけこの中でそれぞれの人のための数値識別子を保存しますセット。例えば、[12321、43432]。このように、あなたは が
方法は、上記で説明し効率的なが賢明かなり効率的なメモリであるRedisの整数設定の利点を取得します。メモリをさらに節約するために、アプリケーション側でキーをさらに圧縮することができます。たとえば、persons:12321
の代わりにp:12321
を格納することができます。プロファイリングを介して、このようなメモリ節約が必要であると判断した場合にのみ、これを行う必要があります。一般的に、それはコストの価値がありません。
コリジョンフリーこれはアプリケーションによって異なります。各ユーザーまたは個人には、決して変更されない主キーが必要です。 Redisキーでこれを使用すると、衝突は発生しません。
あなたは、このアプローチには二つの問題に言及した、と私は彼らにidがコロンを持っている場合はどう
に対処しようとするのだろうか?
もちろん可能ですが、アプリケーションの設計によって妨げられるはずです。複数のシステムで使用されるため、識別子に特殊文字を使用しないことをお勧めします。たとえば、識別子はURLの一部である可能性が高く、コロンはURLの場合でも予約文字です。
本当に識別子に特殊文字を許可する必要がある場合は、特殊文字をエンコードする小さなラッパーをコードに記述する必要があります。 URLエンコーディングはこれを完全に処理できます。
サイズ効率
長いキーへのコストは、しかし、それはあまりないが、あります。一般に、キーではなく値のデータサイズについて心配する必要があります。キーが多すぎるメモリを消費していると思われる場合は、redis-rdb-toolsのようなツールを使用してデータベースをプロファイリングしてください。
キーサイズが問題であると判断してメモリを保存する場合は、エイリアスを使用してキーを書き換える小さなラッパーを作成できます。
素敵な答えです。時間をかけてこの問題に取り組んでいただき、ありがとうございます。以前はあなたのために「バウンティ」ボタンをクリックしなかったことをお詫びしますが、これを初めて使用したのです。ありがとう! –