雙端鍊錶作為一種通用的資料結構在redis 內部使用得非常多它既是redis 列表結構的底
層實現之一還被大量redis 模組所使用用於構建redis 的其他功能。
對列表型別的鍵進行操作——比如執行
rpush 、lpop 或llen 等命令時程式在底層操作的可能就是雙端鍊錶。
note: redis 列表使用兩種資料結構作為底層實現
1. 雙端鍊錶
2. 壓縮列表
因為雙端鍊錶占用的記憶體比壓縮列表要多所以當建立新的列表鍵時列表會優先考慮使用壓
縮列表作為底層實現並且在有需要的時候才從壓縮列表實現轉換到雙端鍊錶實現。
除了實現列表型別以外雙端鍊錶還被很多redis 內部模組所應用
. 事務模組使用雙端鍊錶來按順序儲存輸入的命令
. 伺服器模組使用雙端鍊錶來儲存多個客戶端
. 訂閱/傳送模組使用雙端鍊錶來儲存訂閱模式的多個客戶端
. 事件模組使用雙端鍊錶來儲存時間事件time event
類似的應用還有很多在後續的章節中我們將看到雙端鍊錶在redis 中發揮著重要的作用。
雙端鍊錶的實現由listnode 和list 兩個資料結構構成下圖展示了由這兩個結構組成的一
個雙端鍊錶例項
其中listnode 是雙端鍊錶的節點
typedef struct listnode listnode;
而list 則是雙端鍊錶本身
typedef struct list list;
注意listnode 的value 屬性的型別是void * 說明這個雙端鍊錶對節點所儲存的值的型別
不做限制。
對於不同型別的值有時候需要不同的函式來處理這些值因此list 型別保留了三個函式指標——dup 、free 和match 分別用於處理值的複製、釋放和對比匹配。在對節點的值進行處
理時如果有給定這些函式那麼它們就會被呼叫。
另外從這兩個資料結構的定義上也可以它們的一些行為和效能特徵
1、 listnode 帶有prev 和next 兩個指標因此對鍊錶的遍歷可以在兩個方向上進行從
表頭到表尾或者從表尾到表頭。
2、list 儲存了head 和tail 兩個指標因此對鍊錶的表頭和表尾進行插入的複雜度都為o(1) ——這是高效實現lpush 、rpop 、rpoplpush 等命令的關鍵。
3、list 帶有儲存節點數量的len 屬性所以計算鍊錶長度的複雜度僅為o(1) 這也保證
了llen 命令不會成為效能瓶頸。
redis 為雙端鍊錶實現了乙個迭代器這個迭代器可以從兩個方向對雙端鍊錶進行迭代
1、沿著節點的next 指標前進從表頭向表尾迭代
2、沿著節點的prev 指標前進從表尾向表頭迭代
以下是迭代器的資料結構定義
typedef struct listiter listiter;
direction 記錄迭代應該從那裡開始
1、 如果值為adlist.h/al_start_head 那麼迭代器執行從表頭到表尾的迭代
2、 如果值為adlist.h/al_start_tail 那麼迭代器執行從表尾到表頭的迭代
Redisbook學習筆記(1)字典(1)
字典 dictionary 又名對映 map 或關聯陣列 associative array 它是一種抽象資料結 構,由一集鍵值對 key value pairs 組成,各個鍵值對的鍵各不相同,程式可以將新的鍵值對 新增到字典中,或者基於鍵進行查詢 更新或刪除等操作。字典的主要用途有以下兩個 1.實...
學習筆記1
struct test test int x void fun class test1 test1 int x void fun int main void test1 a 行1 a.fun 行2 test1 b 行3 b.fun 行4 test c 行5 c.fun 行6 test d 行7 d....
學習筆記1
1 字串原地逆序 使用臨時變數 void reverse string s 5 求平均值 避免溢位 int f int x,int y 6 楊氏矩陣 bool young int a m n int x return false 7 十進位制轉十六進製制 string decimaltohexade...