redis set底層資料結構

2021-09-19 21:20:55 字數 1378 閱讀 5944

redis的集合物件set的底層儲存結構特別神奇,我估計一般人想象不到,底層使用了intset和hashtable兩種資料結構儲存的,intset我們可以理解為陣列,hashtable就是普通的雜湊表(key為set的值,value為null)。是不是覺得用hashtable儲存set是一件很神奇的事情。

set的底層儲存intset和hashtable是存在編碼轉換的,使用intset儲存必須滿足下面兩個條件,否則使用hashtable,條件如下:

hashtable的資料結構應該在前面的hash的章節已經介紹過了,所以這裡著重講一下intset這個新的資料結構好了。

intset內部其實是乙個陣列(int8_t coentents陣列),而且儲存資料的時候是有序的,因為在查詢資料的時候是通過二分查詢來實現的。

intset儲存結構

以set的sadd命令為例子,整個新增過程如下:

void saddcommand(redisclient *c)  else 

}// 將所有輸入元素新增到集合中

for (j = 2; j < c->argc; j++)

// 如果有至少乙個元素被成功新增,那麼執行以下程式

if (added)

// 將資料庫設為髒

server.dirty += added;

// 返回新增元素的數量

addreplylonglong(c,added);

}

稍微深入分析一下set的單個元素的新增過程,首先如果已經是hashtable的編碼,那麼我們就走正常的hashtable的元素新增,如果原來是intset的情況,那麼我們就需要進行如下判斷:

/*

* 多型 add 操作

* * 新增成功返回 1 ,如果元素已經存在,返回 0 。

*/int settypeadd(robj *subject, robj *value)

// intset

} else if (subject->encoding == redis_encoding_intset)

// 如果物件的值不能編碼為整數,那麼將集合從 intset 編碼轉換為 ht 編碼

// 然後再執行新增操作

} else

// 未知編碼

} else

// 新增失敗,元素已經存在

return 0;

}

redis set底層資料結構

redis的集合物件set的底層儲存結構特別神奇,我估計一般人想象不到,底層使用了intset和hashtable兩種資料結構儲存的,intset我們可以理解為陣列,hashtable就是普通的雜湊表 key為set的值,value為null 是不是覺得用hashtable儲存set是一件很神奇的事...

C vector底層資料結構

vector 其底層資料結構是陣列,由於陣列的特點,vector也具有以下特性 1 o 1 時間的快速訪問 2 順序儲存,所以插入到非尾結點位置所需時間複雜度為o n 刪除也一樣 3 擴容規則 當我們新建乙個vector的時候,會首先分配給他一片連續的記憶體空間,如std vector vec,當通...

Redis底層資料結構?

福哥口訣法 簡鏈字跳整 壓快壓 sds synamic string 簡單動態字串。支援自動動態擴容的位元組陣列 list 鍊錶 雙端鍊錶。dict 字典。使用雙雜湊表實現的,支援平滑擴容的字典 zskiplist 跳躍表。附加了後向指標的跳躍表 intset 整數集合。用於儲存整數數值集合的自有結...