Redis原始碼分析 intset h c

2021-06-22 10:33:43 字數 675 閱讀 7748

intset.h/c 是redis 的整數set實現,intset的結構體如下:

基本結構

typedef struct intset intset;

intset的第乙個成員encoding,表明contents中的儲存資料的資料長度,可以是16bits, 32bits, 64bits。第二個成員length表示intset中的元素個數。

一些關鍵實現

由於intset屬於底層儲存,所以在讀取資料時,要考慮big endian 和little endian的問題。memrev64ifbe和intrev32ifbe函式,可以將big endian的數能夠轉換成littleendian值。

intset使用陣列(contents)來儲存資料,資料按照由小到大的順序儲存,體現在intsetsearch這個函式的二分查詢方法中。

當插入新元素時,首先判斷encoding是否小於當前值,否則呼叫intsetupgradeandadd函式,將原來intset中的資料都變成新的encoding,同時把新元素插入到set。

在執行intsetadd和intsetremove函式增刪元素的時候,都要呼叫intsetresize增加或者減少空間,同時按照順序插入或者刪除元素。在移動元素時,使用intsetmovetail,內部通過memmove實現。

Redis原始碼分析系列

redis目前熱門nosql記憶體資料庫,量不是很大,本系列是本人閱讀redis原始碼時記錄的筆記,由於時間倉促和水平有限,文中難免會有錯誤之處,歡迎讀者指出,共同學習進步,本文使用的redis版本是2.8.19。redis之hash資料結構 redis之intset資料結構 redis之skipl...

redis原始碼分析 adlist

typedef struct listnode listnode 首先定義了乙個節點,包含前驅和後繼以及對應的value typedef struct listiter listiter list的迭代器,next指標和迭代方向 typedef struct list list 鍊錶內容 head和...

Redis原始碼分析(adlist)

原始碼版本 redis 4.0.1 原始碼位置 redis中的鍊錶叫adlist a generic doubly linked list implementation 乙個通用的雙端鍊錶實現 和普通單鏈表相比,它的方向可以向前或者向後,這是由於資料結構中定義了next和prev兩個指標決定的,下面...