1.指針函數與函數指針
指針函數本質是指針,其返回值是指針。如 float *fun(); 函數指針,本質是指針。如int(*f) (intx);/*聲明一個函數指針*/ ?從直觀上看*號要是和函數名括在一起那么是函數指針 沒有的括在一起的話是指針函數。
2.Redis鏈表類型
I.節點是雙端鏈表
II.鏈表(list)除了有頭指針,尾指針還包括鏈表長度。
3.Redis字典
I.三個重要結構:字典->哈希表->哈希節點
1) 字典包括大小為2的哈希表數組。哈希表結構中又包括哈希表節點數組。哈希節點有后繼節點。即:哈希表節點數組每個元素指向哈希節點鏈表
2) 為了提高插入效率都是在哈希表節點均在前面插入,新插入的節點會成為頭節點。
3)字典中哈希表(一般使用ht[0]進行操作,ht[1]用于rehash。rehash結束后兩個數組交換,并釋放交換后的ht[1]的空間)
4)MurmurHash2算法計算哈希值;地址鏈接法解決hash沖突
II. rehash
1).負載因子=實際哈希節點數 / 哈希節點數組大小 【load_factor = ht[0].used / ht[0].size】。負載因子越大空間開銷越小,查找越慢。
2).觸發時機:
? ? a) 負載因子大于5或者(load_factor >= 1且執行BGSABE或BGREWRITEAOF命令時哈希表擴張。 ??
? ? b)load_factor < 0.1 觸發哈希表收縮。
3).漸進式rehash
? ? a)? 開始期間字典中的rehashIndex字段大于-1,rehash結束rehashIndex重置為-1。
? ? b) rehash期間維護兩個哈希表:查找的時候現在ht[0]中查找,若不成功再去ht[1查找;要是添加的話直接在hash[1]中進行,保證ht[0]只減不增.
4.跳躍表
5.整數集合(intset)
I.有序且不重復
6.壓縮列表(ziplist)
I.節點:previous_enrty_length,encoding,content組成
1)previous_enrty_length 前一個節點的長度
2)encoding:數據類型 + 數據長度
00,10,10開頭表示字節數據類型,11開頭表示為整數。
其中00 開頭表示編碼長度為1字節,后6位表示數組實際長度,且content字節數組長度<=63;
其中01 開頭表示編碼長度為2字節,后14位表示數組實際長度,content字節數組長度<=16383;
其中10開頭表示編碼長度為5字節,后32位表示數組實際長度,content字節數組長度<=4294967295。