redis列表底層實現之一 鍊錶

2022-08-03 10:27:11 字數 813 閱讀 3440

注意標題中的「之一」,那麼什麼情況下,列表會使用鍊錶作為其資料結構呢?

答案就是——列表鍵包含了大量的元素,或者列表中包含的元素都是比較長的字串。

ok,由於鍊錶大家都比較熟悉,接下來就直接給出鍊錶和鍊錶節點的實現。

鍊錶節點:

typedef struct listnode listnode;

鍊錶:typedef struct list list;

首先先說明listnode 和 list的大小。sizeof(listnode) = 12, sizeof(list) = 24。別忘了list中還有三個函式指標。下面給出在vs中的測試:

圖中的資訊很明顯了,listt中的只是成員函式,而list中的是函式指標。

上圖就是乙個list結構了。

最後再多說一句,為什麼listnode中的value要定義為void*?

value設定為void*,是因為這樣可以儲存各種不同型別的值,這就形成了一種多型,使得list中的dup、free、match函式都可以根據節點值來設定型別特定函式。

Redis底層之鍊錶

redis底層鍊錶節點使用listnode來實現。每個listnode節點包含三個成員,乙個prev指標指向前乙個listnode,乙個next指標指向下乙個節點。乙個value指標指向任何型別的值。多個listnode通過prev和next指標組成雙端鍊錶。通過乙個list比較方便地來管理產生的l...

redis列表系列之一

目錄 lpush lpushx rpush rpushx lpop rpop rpoplpush 模式 1.語法 lpush key value value 2.解析 將乙個或多個值value插入到列表key的表頭 如果有多個value值,那麼各個value值按從左到右的順序依次插入到表頭 比如說,...

Redis的跳躍表底層實現

跳躍表是一種有序的資料結構,主要用在zset 有序集合 和集群節點的內部資料結構。在大部分情況下,跳躍表的效率可以和平衡樹相媲美,並且因為跳躍表的實現比平衡樹要來得更為簡單,所以有不少程式都使用跳躍表來代替平衡樹。注意mysql的底層採用的是b 樹實現。跳躍表的實現 redis的跳躍表由redis....