redis
的鍊錶資料結構基於
adlist.h
檔案定義的以下三種資料結構來展開:
node:
typedef struct listnode listnode 這裡
node
的value
為什麼要弄成指標?
是為了相容多種型別的
node
,顯然這裡的
node
既可以儲存
int等常規數字,也可以存
string
,當然也可以存其他的複雜的
struct
,想怎樣都行,所以
redis
的鍊錶在
redis
的很多重要功能(如發布與訂閱,慢查詢,監視器)中都有應用。
list:
typedef struct list list
很明顯,
list
採用如此大的結構體儲存乙個鍊錶,是用空間換時間的路子,使得一些常用的鍊錶操作能在
o(1)
的複雜度下拿下。
同時,list
結構體中包含有三個函式指標,是為了相容不同型別的
value
結點,可以為特定型別的結點定製自己的複製、釋放、對比函式,非常靈活,這一種抽象思維值得借鑑。
迭代器iterator:
typedef struct listiter listiter
而迭代器的使用,則是一種外部封裝,使得一些對特定資料結構的遍歷,能用一套東西來完成,從而保護了內部的資料結構,也使得上層呼叫不用關心具體的實現,既安全又方便,何樂而不為?
【特麼c++的
stl中也抽出了乙個章節專門講迭代器,當年學的現在也忘記的差不多了。以後有空要去補起來,很多語言的優點都是互相借鑑的,恩。。自己要多讀書,夯實基礎!】
Redis 資料結構之List 雙端鍊錶
list 鍊錶作為陣列之外的一種常用序列抽象,是大多數高階語言的基本資料型別,因為 c 語言本身不支援鍊錶型別,大部分 c 程式都會自己實現一種鍊錶型別,redis 也不例外 實現了乙個雙端鍊錶結構。在redis中,list的最大長度為2 32 1。除了實現列表型別以外,雙端鍊錶還被很多 redis...
Redis底層資料結構之雙端鍊錶
鍊錶這種資料結構相信大家也不陌生,有很多態別,比如單向鍊錶,雙向鍊錶,迴圈鍊錶等,鍊錶相對於陣列來說,一是不需要連續的記憶體塊位址,二是刪除和插入的時間複雜度是 o 1 級別的,非常的高效,但比不上陣列的隨機訪問查詢方式。一樣的那句話,沒有最好的資料結構,只有恰到好處的資料結構,比如我們後面要介紹的...
Java資料結構之鍊錶 雙端鍊錶
鍊錶 linked list 是一種常見的基礎資料結構,是一種線性表,但是並不會按線性的順序儲存資料,而是在每乙個節點裡存到下乙個節點的指標 pointer 使用鍊錶結構可以克服陣列鍊錶需要預先知道資料大小的缺點,鍊錶結構可以充分利用計算機記憶體空間,實現靈活的記憶體動態管理。但是鍊錶失去了陣列隨機...