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 整數集合。用於儲存整數數值集合的自有結...