redis原始碼淺見之adlist

2021-10-07 02:54:57 字數 695 閱讀 1725

adlist是redis專案封裝的乙個鍊錶操作的庫,其官方解釋為a generic doubly linked list implementation,實際是組裝了乙個帶頭節點的雙向非迴圈煉表頭,節點自持鍊錶首尾兩個資料節點,依次達到快速操作的目的。

原始碼鏈結如下:

adlist.h

adlist.c

難點

亮點:是listiter這個struct的封裝和實現,它封裝了鍊錶的操作,如此在了解鍊錶的基礎知識後,可以很快入手adlist的使用,且由於封裝嚴格,所以基本不會出現指標操作失誤的情況。

鍊錶的核心:乙個資料節點分為兩部分:資料部分和指標部分。資料部分用於儲存資料,指標部分可是乙個本型別的指標,由此可以指向任意乙個同型別的資料節點,有序的將多個資料節點組裝起來後,便生成乙個鍊錶。資料節點的組裝必須是有有序的,形成一種鏈式結構。另外指標部分可以是乙個或者兩個,乙個則只能有一種指向,兩個則可以前後同時指向。

有時鍊錶還存在乙個頭節點,頭節點可以與資料節點是同型別的,也不可以不同型別,資料節點隨時都有可能變更,但頭節點不會,在鏈結建立之初被建立,直到鍊錶銷毀,頭節點一般持有首部資料節點或者尾部資料節點,或者兩個均持有。

鍊錶分類

迴圈 頭節點

ps:閱讀redis原始碼,特此記憶,望堅持。

redis原始碼之dict

大家都知道redis預設是16個db,但是這些db底層的設計結構是什麼樣的呢?我們來簡單的看一下原始碼,重要的字段都有所注釋 typedef struct redisdb redisdb redis中的所有kv都是存放在dict中的,dict型別在redis中非常重要。字典disc的資料結構如下 t...

Redis 原始碼學習之 Redis 事務Nosql

redis事務提供了一種將多個命令請求打包,然後一次性 按照順序地執行多個命令的機制,並且在事務執行的期間,伺服器不會中斷事務而去執行其他不在事務中的命令請求,它會把事務中所有的命令都執行完畢才會去執行其他的命令。howredis中提供了multi discard exec watch unwatc...

Redis原始碼學習之 Tcp Socket封裝

anet.h anet.c 主要包含以下幾個封裝函式 這裡僅介紹關於tcp socket的封裝函式 anettcpconnect 建立socket並呼叫底層的connect進行連線。anettcpnonblockconnect 和anettcpconnect功能類似,但是設定連線的socket為非阻...