27 Redis設計與實現 鍊錶

2021-08-14 02:47:51 字數 1347 閱讀 2969

鍊錶提供了高效的節點重排能力,以及順序性的節點訪問方式,並且可以通過增刪節點來靈活地調整鍊錶的長度。

作為一種常用資料結構,鍊錶內建在很多高階的程式語言裡面,因為redis 使用的c 語言並沒有內建這種資料結構,所以redis 構建了自己的鍊錶實現。

鍊錶在redis 中的應用非常廣泛,比如列表鍵的底層實現之一就是鍊錶。當乙個列表鍵包含了數量比較多的元素,又或者列表中包含的元素都是比較長的字串時, redis 就會使用鍊錶作為列表鍵的底層實現。

除了鍊錶鍵之外,發布與訂閱、慢查詢、監視器等功能也用到了鍊錶, redis 伺服器本身還使用鍊錶來儲存多個客戶端的狀態資訊,以及使用鍊錶來構建客戶端輸出緩衝區( output buffer )。

每個鍊錶節點使用乙個adlist.h/listnode 結構來表示:

typedef struct listnode  list;
list 結構為鍊錶提供了表頭指標head、表尾指標tail ,以及鍊錶長度計數器len,而dup 、free 和match 成員則是用於實現多型鍊錶所需的型別特定函式:

 dup 函式用於複製鍊錶節點所儲存的值;

 free 函式用於釋放鍊錶節點所儲存的值;

 match 函式則用於對比鍊錶節點所儲存的值和另乙個輸入值是否相等。

圖3-2 是由乙個list 結構和三個listnode結構組成的鍊錶。

redis 的鍊錶實現的特性可以總結如下:

 雙端:鍊錶節點帶有prev 和next 指標,獲取某個節點的前置節點和後置節點的複雜度都是o(1)。

 無環:表頭節點的prev 指標和表尾節點的next 指標都指向null ,對鍊錶的訪問以null 為終點。

 帶表頭指標和表尾指標:通過list 結構的head 指標和tail 指標,程式獲取鍊錶的表頭節點和表尾節點的複雜度為o(1)。

 帶鍊錶長度計數器:程式使用list 結構的len 屬性來對list 持有

的鍊錶節點進行計數,程式獲取鍊錶中節點數量的複雜度為o(1)。

 多型:鍊錶節點使用void*指標來儲存節點值,並且可以通過list 結構的dup、free、match 三個屬性為節點值設定型別特定函式,所以鍊錶可以用於儲存各種不同型別的值。

表3-1 列出了所有用於操作鍊錶和鍊錶節點的api。

Redis設計與實現 2 鍊錶

鍊錶提供了高效的節點重排能力,以及順序性的節點訪問方式,並且可以通過增刪節點來靈活地跳轉鍊錶的長度。作為一種常用資料結構,鍊錶內建在很多高階的程式語言裡面,因為redis使用c語言並沒有內建這種資料結構,所以redis構建了自己的鍊錶實現。鍊錶在redis中的應用非常多,比如列表鍵的底層實現之一就是...

Redis設計與實現筆記 3 鍊錶

鍊錶提供了高效的節點重排能力,以及順序性的節點訪問方式,並且可以通過增刪節點來靈活地調整鍊錶的長度。鍊錶在redis中的應用非常廣泛,比如列表鍵 的底層實現之一就是鍊錶。除了鍊錶鍵之外,發布與訂閱,慢查詢,監視器等功能也用到了鍊錶,redis伺服器本身還使用鍊錶來儲存多個客戶端的狀態資訊,以及使用鍊...

Redis設計與實現之SDS和鍊錶

比如我們可以在redis客戶端敲 redis set msg helloredis 那麼就會在redis資料庫中建立乙個新的鍵值對,keg是msg,value是helloredis,兩個都是sds。又比如在redis客戶端敲 redis rpush number 1 2 3這也就是乙個list物件 ...