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 ビットを占めます。
同じ型が異なるエンコーディングに対応する場合もあります。これは、同じデータ型が異なる内部表現を持つ可能性があることを意味します。内部表現が異なると、メモリ使用量と検索パフォーマンスも異なります。
OBJ_ENCODING_INT: 文字列は数値で表され、実際にはlong型です。
OBJ_ENCODING_QUICKLIST: クイックリストとして表現されます。リストデータ構造に使用されます。
redisObject の役割は次のとおりです。
redisObjec は次のとおりです。 2 つの間のリンク データ構造のレベル間の橋渡し。
複数のデータ型の統一表現を提供します。
同じ種類のデータで異なる内部表現を使用できるようにすることで、場合によってはメモリをできるだけ節約します。
オブジェクトの共有と参照カウントをサポートします。オブジェクトが共有される場合、占有されるメモリ コピーは 1 つだけなので、メモリがさらに節約されます。
以上がRedisのオブジェクト構造を定義する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。