ホームページ  >  記事  >  データベース  >  Redisのオブジェクト構造を定義する方法

Redisのオブジェクト構造を定義する方法

WBOY
WBOY転載
2023-05-28 17:20:171612ブラウズ

Redisのオブジェクト構造を定義する方法

Redis の 2 層データ構造の紹介

Redis のパフォーマンスが高い理由の 1 つは、その各データ構造が次のとおりであることです。特別に設計された であり、1 つ以上のデータ構造によってサポートされており、これらの柔軟なデータ構造に依存して読み取りおよび書き込みのパフォーマンスが向上します。 Redis のデータ構造は 2 つの異なる観点から議論できます

  • 最初のレベルはユーザーの観点からのものであり、このレベルは Redis が外部に公開する呼び出しインターフェイスでもあります。 : 文字列、リスト、ハッシュ、セット、ソートされたセット。

  • 2 番目のレベルは内部実装の観点からのもので、dict、sds、ziplist、quicklist、skiplist、intset などの下位レベルの実装に属します。

Redis データ構造の内部実装

Redis ユーザーの観点から見ると、Redis ノードには複数のデータベース (非クラスターのデフォルト) が含まれています。モードでは 16、クラスター モードでは 1 のみ)、データベースはキー スペースからオブジェクト スペースへのマッピング関係を維持します。このマッピング関係のキーは文字列型であり、値は文字列、リスト、ハッシュ、セット、ソート セットなどの複数のデータ型にすることができます。キーのタイプは常に文字列ですが、値は複数のタイプである場合があります。

Redis の内部実装の観点から見ると、データベース内のマッピング関係は辞書を使用して維持されます。 dict のキーが固定データ構造 (動的文字列 sds) で表現されていれば十分です。値はさらに複雑です。異なる種類の値を同じ辞書に格納するには、共通のデータ構造が必要です。この共通のデータ構造は robj で、その完全名は redisObject です。

例:

  • 値がリストの場合、その内部ストレージ構造はクイックリストです。

  • 一般に、値が文字列の場合、その内部ストレージ構造は通常 sds です。ただし、文字列型の値が数値の場合、Redis はそれをストレージ用に内部的に long 型に変換するため、メモリ使用量が削減されます。

つまり、 robj は sds だけでなく、クイックリスト、さらには長い型も表すことができます。

redisObject の構造

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 ビットを占めます。

  • #refcount: 参照カウント。これにより、特定の状況下で robj オブジェクトを共有できるようになります。

  • ptr: データ ポインタ。実際のデータを指します。たとえば、文字列を表す robj は、その ptr が sds 構造を指す場合があり、リストを表す robj は、その ptr がクイックリストを指す場合があります。

  • ここで慎重に検討する必要があるのは、エンコーディング フィールドです。

    同じ型が異なるエンコーディングに対応する場合もあります。これは、同じデータ型が異なる内部表現を持つ可能性があることを意味します。内部表現が異なると、メモリ使用量と検索パフォーマンスも異なります。

type = OBJ_STRING の場合、この robj には文字列が格納されることを意味し、このときのエンコーディングは次の 3 種類のいずれかになります。 OBJ_ENCODING_RAW: 文字列はネイティブ表現、つまり sds を使用します。

OBJ_ENCODING_INT: 文字列は数値で表され、実際にはlong型です。

  • OBJ_ENCODING_EMBSTR: 文字列は特別な埋め込み SDS によって表されます。

  • type = OBJ_HASH の場合、この robj にはハッシュが格納されることを意味し、このときのエンコーディングは次の 2 つのいずれかになります。 ##OBJ_ENCODING_HT: ハッシュは辞書で表されます。

  • OBJ_ENCODING_ZIPLIST: ハッシュはジップリストで表されます。

エンコーディングの 10 個の値は次のとおりです。

  • OBJ_ENCODING_RAW: 最もネイティブな表現。このエンコード値は、文字列タイプ (sds で表される) にのみ適用されます。

  • OBJ_ENCODING_INT: 数値で表されます。実際にはlongで表されます。

OBJ_ENCODING_HT: dict として表現されます。

  • 「OBJ_ENCODING_ZIPMAP」は古い表現であり、現在は使用されていません。 Redis 2.6 より小さいバージョンでのみ使用できます。

  • OBJ_ENCODING_LINKEDLIST: これも古い表現であり、現在は使用されていません。

  • OBJ_ENCODING_ZIPLIST: ジップリストとして表現されます。

  • OBJ_ENCODING_INTSET: intset として表現されます。セットデータ構造に使用されます。

  • スキップリスト形式で表されるオブジェクト エンコーディングは OBJ_ENCODING_SKIPLIST です。ソートされたセットのデータ構造に使用されます。

  • OBJ_ENCODING_EMBSTR: 特殊な埋め込み SDS として表されます。

  • OBJ_ENCODING_QUICKLIST: クイックリストとして表現されます。リストデータ構造に使用されます。

redisObject の役割

redisObject の役割は次のとおりです。

  • redisObjec は次のとおりです。 2 つの間のリンク データ構造のレベル間の橋渡し。

  • 複数のデータ型の統一表現を提供します。

  • 同じ種類のデータで異なる内部表現を使用できるようにすることで、場合によってはメモリをできるだけ節約します。

  • オブジェクトの共有と参照カウントをサポートします。オブジェクトが共有される場合、占有されるメモリ コピーは 1 つだけなので、メモリがさらに節約されます。

以上がRedisのオブジェクト構造を定義する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。