Redisが使用するデータ構造

翻訳者から:

Redisの開発者の1人が、Redis内でどのデータ構造が使用されているかという質問に対する答えを翻訳したものに注目したいと思います。 stackoverflowに関する最初の議論を見つけることができます。



質問に答えようとしますが、一見奇妙に見えるかもしれませんが、Redisの内部構造に興味がない場合は、内部からデータ構造がどのように実装されるか心配する必要はありません 。 この理由は単純です-各Redisチームの複雑さはドキュメントで確認できます。一連の操作とその計算の複雑さがある場合、必要なのはメモリ使用量のアイデアだけです(そして多くの最適化を行うため、データに応じて、これらの最後の数値を取得する最良の方法は、実際のテストを使用することです)



しかし、あなたが尋ねたので、ここに各Redisデータ構造の内部実装があります:





しかし、要素の数と最大値のサイズの点でリスト、セット、および順序付きセットが小さい場合、別のよりコンパクトな表現が使用されます。 この表現は構造によって異なりますが、次の機能があります。コンパクトなBLOBであり、多くの場合、操作ごとにO(N)の複雑さを持ちます。 この形式は小さなオブジェクトにのみ使用するため、これは問題ではありません。 小さなO(N)BLOBを通過することはキャッシュに依存せず(キャッシュを無視するアルゴリズム、翻訳者のメモ) 、実際には非常に高速であり、要素が多数あるとすぐに、ビューは自動的にネイティブのもの(リンクリスト、ハッシュ、など)。



しかし、あなたの質問は、実際には、内部に関することだけではありません。あなたは尋ねたいと思いました。 「。





線は基本構造です。 これは4つの基本構造の1つであり、すべての複雑な構造の基礎でもあります。リストは文字列のリストであり、多くは多くの文字列であるためです。



文字列は、HTMLページを保存するすべての明らかなユースケースで適していますが、既にエンコードされたデータの変換を避けたい場合にも適しています。 たとえば、JSONまたはMessagePackがある場合、オブジェクトを文字列として保存できます。 Redis 2.6では、Luaスクリプトを使用してこの種のサーバー側の構造を管理することもできます。



文字列のもう1つの興味深い使用法はビットマップです。一般的に、バイト配列へのランダムアクセスは、Redisが任意のバイト範囲または個々のビットにアクセスするためのコマンドを提供するためです。 例として、 この素晴らしい投稿をチェックしてください:Redisを使用したFast Easyリアルタイムメトリック



リスト



リストは、主に極端な要素(尾の近くまたは頭の近く)で作業する場合に適しています。 ランダムアクセスが遅いO(N)のため、リストをページに分割するには最適な選択ではありません。 リストの適切な使用法は、単純なキューとスタック、またはRPOPLPUSHコマンドを使用した要素の循環処理で、そのパラメーターは同じリストになります。



リストは、N個の要素の限定されたコレクションが必要な場合、 通常は上位または下位要素のみにアクセスする場合、またはNが小さい場合に同様に優れています。



多くの



セットは順序付けられたデータのセットではなく、要素のコレクションがある場合に効果的であり、コレクション内の要素の存在をすばやく確認するか、そのサイズを取得することが重要です。 セットのもう1つの「トリック」は、ランダム要素を取得する機能です(SRANDMEMBERおよびSPOPコマンド)。



関係は、たとえば「ユーザーXの友達とは何ですか?」などのようによく表されます。 しかし、後で見るように、そのようなものに適した他の構造、順序セットがあります。



多くは、インターセクション、ユニオンなどの複雑な操作をサポートします。これは、データがあり、そのデータに対して変換を実行して結果を取得したい場合に、「計算」方法でRedisを使用する良い方法です。



小さなセットは非常に効率的な方法でエンコードされます。



ハッシュ



ハッシュは、フィールドと値で構成されるオブジェクトを表すための優れた構造です。 ハッシュフィールドは、HINCRBYコマンドでアトミックにインクリメントできます。 ユーザー、ブログの投稿、またはその他の種類の要素などのオブジェクトがある場合、JSONなどの独自の形式を使用したくない場合、ハッシュが必要です。



ただし、Redisの小さなハッシュは非常に効率的にエンコードされ、アトミックGET、SET操作を使用するか、単一フィールドを高速でアトミックにインクリメントできることに注意してください。



ハッシュを使用して、参照を使用して関連データ構造を表すこともできます。 例として、lamernews.comでコメントの実装を見てください。



順序付きセット



順序付きセットは、順序付き要素の操作をサポートするリスト以外唯一のデータ構造です。 順序付きセットを使用すると、多くのクールなことができます。 たとえば、Webアプリケーションにあらゆる種類のTop of Somethingを実装できます。 評価によるトップユーザー、ビュー数によるトップポスト、トップ何か、およびRedisの1つのインスタンスは、1秒あたり大量の挿入とクエリを提供します。



順序セットは、通常のセットと同様に関係を記述するために使用できますが、要素をページに分割して順序を維持することもできます。 たとえば、ユーザーXの友人を順序付きセットとして保存すると、友人として追加された順序で簡単に保存できます。



順序付きセットは、優先キューに適しています。



順序付きセットは、リストの中央から要素を挿入、削除、または取得するのと同じくらい高速な、より強力なリストのようなものです。 しかし、それらはより多くのメモリを使用し、O(log(N))構造です。



おわりに



この投稿で情報を提供したいと思いますが、 lamernewsのソースコードをダウンロードして、それがどのように機能するかを理解する方がずっと良いでしょう。 ほとんどのRedisデータ構造はLamer Newsで使用されており、それらを使用することは、この問題を解決するために何を使用するかの手がかりになります。



All Articles