ソースコード分析 Redis の基礎となるデータ構造 - リンクされたリスト

意味

一般的に使用されるデータ構造として、連結リストは Java などの多くの高度なプログラミング言語で構築されています。これは、Redis が C 言語で開発されているためですが、C 言語には組み込みの連結リスト データ構造がないため、Redis は独自に構築したものです。リンク リストの実装。

各連結リスト ノードはadlist.h/listNode構造体。

/* Node, List, and Iterator are the only data structures used currently. */

typedef struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;
} listNode;

複数はlistNode、次の図に示すように、prevnextポインタを介して両端連結リストを形成できます。

ここに画像の説明を挿入

リンク リストには、複数のリンク リスト ノード (adlist.h/list) を含めることができます。

/*
 * 双端链表结构
 */
typedef struct list {

    // 表头节点
    listNode *head;

    // 表尾节点
    listNode *tail;

    // 节点值复制函数
    void *(*dup)(void *ptr);

    // 节点值释放函数
    void (*free)(void *ptr);

    // 节点值对比函数
    int (*match)(void *ptr, void *key);

    // 链表所包含的节点数量
    unsigned long len;
} list;

dup および free match` メンバーは、多態的なリンク リストを実装するために必要なタイプ固有の関数です结构为链表提供了表头指针、表尾指针

  • dupこの関数は、リンク リスト ノードによって保存された値をコピーするために使用されます。
  • freeこの関数は、リンク リスト ノードによって保存された値を解放するために使用されます。
  • matchこの関数は、リンク リスト ノードによって格納された値が別の入力値と等しいかどうかを比較するために使用されます。

要約する

  • リンクされたリストは、キーのリスト、パブリッシュとサブスクライブ、スロー クエリ、監視など、Redis のさまざまな機能を実装するために広く使用されています。
  • 各リンク リスト ノードはlistNode構造体、各ノードには先行ノードと後続ノードへのポインターがあるため、Redis のリンク リスト実装は両端リンク リストです。
  • 各連結リストは、list構造体。この構造体には、ヘッド ノード ポインタ、テール ノード ポインタ、連結リストの長さなどの情報が含まれています。
  • リンク リストのヘッド ノードのフロント ノードとテール ノードのポスト ノードの両方がそれを指しているためNULL、Redis のリンク リスト実装は非循環リンク リストです。
  • 連結リストに異なるタイプ固有の関数を設定することで、Redis 連結リストを使用してさまざまなタイプの値を格納できます。

おすすめ

転載: blog.csdn.net/m0_54369189/article/details/113703527