?? ???? ?簡單動態字符串
?? ???? ?鏈表
?? ???? ?字典
?? ???? ?跳躍表
?? ???? ?整數集合
?? ???? ?壓縮列表
?? ???? ?對象
SDS
增加了len和free屬性,記錄buf數組的使用空間和剩余空間。好處:strken函數直接讀取len值,時間復雜度是O(1);預分配buf長度,避免頻繁申請內存空間。分配規則,每次申請的free和len一樣,最大額外申請1MB空間。
鏈表
由list和listNode兩個數據結構組成。list記錄了head、tail和len,表示鏈頭、鏈尾和長度。listNode是一個雙端節點,包含prev、next和value。
字典
由字典、哈希表、哈希表節點組成。字典記錄了元素類型、兩個哈希表和rehash標識。哈希表記錄了節點數組、數組長度、節點數量。哈希表節點記錄了key、value和next指針。value是一個復合結構,可以是指針或者整型數字。
哈希表擴縮容是通過rehash實現。開始rehash時,字典表啟用另一個哈希表,容量是原來的兩倍。再將原來的數據rehash過去。
為了避免一次性遷移太多數據,通過漸漸式hash。在key被更新、刪除、查詢的時候才做rehash。直到所有key都遷移完成,再把老的哈希表清空。
Rehash觸發的條件,在非bgsave或bgrewriteaof時,容量因子大于1就開始執行。在bgsave或bgrewriteaof期間,容量因子要大于5才開始執行。避免期間rehash產生額外的內存,影響子進程的效率。
跳躍表
是有序集合的底層實現之一,由跳躍表和跳躍表節點組成。跳躍表包含頭節點、尾節點和鏈表長度屬性。跳躍表節點包含層級數組(跨度、前進指針)、后退指針、分數和obj組成。
節點排序規則是按分數從小到大排列,分數相同按照obj的字典順序排列。
跳躍表和平衡數的區別是,跳躍表查詢復雜度平均跟平衡樹一樣是logn,最差是n2,但是它的實現很簡單。
整數集合
是集合的底層實現之一,當集合里只包含整數時,會使用這個結構。包含編碼類型、長度和元素數組組成。編碼類型包括int16、int32、int64,元素數組里的類型和編碼類型相同。
當新元素比元素數組里存放的類型比大時,會進行類型升級,重新分配空間和排序。升級的好處是能節約空間,并且可以靈活存放不同類型的數據。只會升級不會降級。
壓縮列表
是列表和哈希表底層的實現之一,當只包含數字和短的字符串時,使用這個結構。由壓縮列表和節點構成。壓縮鏈表包含字節大小、尾指針偏移量、節點個數、節點列表、結束標識。壓縮節點包含上個節點的長度、編碼類型和節點值。
上個節點的長度是動態的,分為1字節和5字節。上個節點的字節長度大于254時,升級到5字節。
對象
包含字符串、列表、哈希、集合和有序集合五種對象類型。
字符串由int、embstr和raw構成,占用空間從小到大,
列表由壓縮列表和鏈表組成,元素少的時候用壓縮列表。空間緊湊,節約內存。
哈希由壓縮列表和字典組成,使用壓縮列表主要也是省空間。
集合由整型數組和哈希組成。元素少的時候,就用整型數組,空間利用率高。
有序集合由壓縮列表和跳表加字典的組成。跳表時候范圍查詢,字典適合單值查詢。
?