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為非阻...