この記事では、Redis に関する関連知識を提供します。主に、2 層データ構造、データ構造の内部実装、オブジェクト構造など、オブジェクトに関する関連問題を紹介します。以下の関連コンテンツが皆様のお役に立てれば幸いです。
推奨学習: Redis ビデオ チュートリアル
redis のパフォーマンスが高い理由の 1 つは、各データ構造が特別に設計され、1 つ以上のデータ構造によってサポートされていることです。これらの柔軟なデータ構造に依存して、読み取りと書き込みのパフォーマンスが向上します。 Redis のデータ構造を理解したい場合は、2 つの異なるレベルから議論できます。
最初のレベルはユーザーの観点からのもので、このレベルは Redis が公開するものでもあります。外部呼び出しインターフェイス (文字列、リスト、ハッシュ、セット、ソートされたセットなど)。
2 番目のレベルは内部実装の観点からのもので、dict、sds、ziplist、quicklist、skiplist、intset などの下位レベルの実装に属します。
Redis ユーザーの観点から見ると、Redis ノードには複数のデータベース (非クラスターのデフォルト) が含まれています。モードでは 16、クラスター モードでは 1 のみ)、データベースはキー スペースからオブジェクト スペースへのマッピング関係を維持します。このマッピング関係のキーは文字列型であり、値は文字列、リスト、ハッシュ、セット、ソート セットなどの複数のデータ型にすることができます。キーのタイプは文字列に固定されていますが、可能な値のタイプは複数であることがわかります。
Redis の内部実装の観点から見ると、データベース内のマッピング関係は辞書を使用して維持されます。 dict のキーが固定データ構造 (動的文字列 sds) で表現されていれば十分です。値はさらに複雑です。異なる種類の値を同じ辞書に格納するには、共通のデータ構造が必要です。この共通のデータ構造は robj で、その完全名は redisObject です。
例:
値がリストの場合、その内部ストレージ構造はクイックリストです。
値が文字列の場合、その内部ストレージ構造は通常 sds です。ただし、文字列型の値が数値の場合、Redis はそれをストレージ用に内部的に long 型に変換するため、メモリ使用量が削減されます。
つまり、 robj は sds だけでなく、クイックリスト、さらには長い型も表すことができます。
redisObject の定義は次のとおりです:
typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:LRU_BITS; /* lru time (relative to server.lruclock) */ int refcount; void *ptr;} robj;
A robj には次の 5 つのフィールドが含まれます:
type : オブジェクトのデータ型。 4ビットを占有します。可能な値は 5 つあります: OBJ_STRING、OBJ_LIST、OBJ_SET、OBJ_ZSET、
OBJ_HASH。これらはそれぞれ、Redis によって公開される 5 つのデータ構造に対応します。
エンコーディング: の内部表現。オブジェクト (エンコーディングとも呼ばれます) は 4 ビットを占有し、10 個の可能な値を持ちます。
lru: LRU 置換アルゴリズムに使用され、24 ビットを占めます。
同じ型が異なるエンコーディングに対応する場合もあります。これは、同じデータ型が異なる内部表現を持つ可能性があることを意味します。内部表現が異なると、メモリ使用量と検索パフォーマンスも異なります。
type = OBJ_STRING の場合、この robj には文字列が格納されることを意味し、このときのエンコーディングは次の 3 種類のいずれかになります。 OBJ_ENCODING_RAW: 文字列はネイティブ表現、つまり sds を使用します。OBJ_ENCODING_LINKEDLIST: これも古い表現であり、現在は使用されていません。
OBJ_ENCODING_ZIPLIST: ジップリストとして表現されます。
OBJ_ENCODING_INTSET: intset として表現されます。セットデータ構造に使用されます。
OBJ_ENCODING_SKIPLIST: スキップリストとして表現されます。ソートされたセットのデータ構造に使用されます。
OBJ_ENCODING_EMBSTR: 特別な埋め込み SDS として表されます。
OBJ_ENCODING_QUICKLIST: クイックリストとして表現されます。リストデータ構造に使用されます。
redisObject の役割は次のとおりです。
redisObjec は次のとおりです。 2 つの間のリンク データ構造のレベル間のブリッジ。
複数のデータ型の統一表現を提供します。
同じ種類のデータで異なる内部表現を使用できるようにすることで、場合によってはメモリをできるだけ節約します。
オブジェクトの共有と参照カウントをサポートします。オブジェクトが共有される場合、占有されるメモリ コピーは 1 つだけなので、メモリがさらに節約されます。
推奨される学習: Redis ビデオ チュートリアル
以上がRedis 学習スキルのオブジェクトの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。