Redis常見容器
簡單動態字符串
優勢:
- 嘗試複雜度獲取字符串長度
- 杜絕緩衝區溢出
- 減少修改字符串時帶來的內存重分配次數
- 空間預分配
- 惰性空間釋放
- 二進制安全(保存二進制文件)
- 兼容部分C字符串函數
鏈表
鏈表節點:
鏈表頭:
字典
哈希表
哈希表節點:
字典
哈希算法與衝突解決
哈希計算:
# 使用字典設置的哈希函數,計算鍵key的哈希值
hash = dirct->type->hashFunction(key);
# 使用哈希表的sizemaks屬性和哈希值,計算出索引值 根據情況不同,hx[x]可以時hx[0]或hx[1]
index = hash & dict->hx[x].sizemask;
衝突解決:
鏈地址法解決衝突
Rehash
條件:
過程:
方式:
漸進式rehash
跳躍表
整數集合
升級:
每當我們要將一個新元素添加到整數集合裏面,並且新元素的類型比整數集合現有所有元素的類型都要長時,整數集合需要先進行升級( upgrade),然後才能將新元素添加到整數集合裏面。
升級的優勢:
- 提升靈活性
- 節約內存
壓縮列表
節點:
previous_entry_length:
節點的 previous_entry_length屬性以字節爲單位,記錄了壓縮列表中前一個節點的長度。 previous_entry_length屬性的長度可以是1字節或者5字節:
- 屬性長度
- 當前一節點長度小於254字節時,採用1字節空間存儲前一節點的長度
- 當前一節點長度大於等於255字節時,採用5字節空間存儲前一節點的長度
encoding:
節點的encoding屬性記錄了節點的content屬性所保存數據的類型以及長度。
- 屬性長度
- 一字節、兩字節或者五字節長,值的最高位爲00、01或者10的是字節數組編碼:這種編碼表示節點的 content屬性保存着字節數組,數組的長度由編碼除去最高兩位之後的其他位記錄
- 一字節長,值的最高位以11開頭的是整數編碼:這種編碼表示節點的 content屬性保存着整數值,整數值的類型和長度由編碼除去最高兩位之後的其他位記錄;
content:
節點的 content屬性負責保存節點的值,節點值可以是一個字節數組或者整數,值的類型和長度由節點的 encoding屬性決定。
連鎖更新問題:
插入時的連鎖更新:
刪除時的連鎖更新:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳