Redis 学習スキルのオブジェクトの詳細な説明

WBOY
リリース: 2022-04-29 21:12:52
転載
3248 人が閲覧しました

この記事では、Redis に関する関連知識を提供します。主に、2 層データ構造、データ構造の内部実装、オブジェクト構造など、オブジェクトに関する関連問題を紹介します。以下の関連コンテンツが皆様のお役に立てれば幸いです。

Redis 学習スキルのオブジェクトの詳細な説明

推奨学習: 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 ビデオ チュートリアル

以上がRedis 学習スキルのオブジェクトの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート