Redis笔记之基本数据结构 字典
生活随笔
收集整理的這篇文章主要介紹了
Redis笔记之基本数据结构 字典
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
字典
符號表、關聯數組或者映射,有點類似于java中的map,用于保存鍵值對key-value。字典中的鍵key是獨一無二的。底層實現為哈希表。下面進行簡述:
- 哈希表。哈希表主要包含table數組、size、sizemask以及used。table用于保存哈希表節點,保存數據;sizemask為哈希表掩碼用于計算索引;size用于保存table大小;used用于保存已經保存的節點數目,如圖dictht結構體。
- 哈希表節點。用于保存key-value數據,以及next指針用于指向下一個節點,為了解決哈希沖突而采用的拉鏈法。
- 字典。主要包含type、privdata、ht[2]、rehashidx幾個屬性。type表示字典數據類型;privdata保存了需要傳遞給type指定類型函數的可選參數;ht[2]指向兩個哈希表,一個用于平時保存數據,另一個用于rehash(擴容等)時使用;rehashidx在rehash使用,用于表示當前正在轉移table中第幾個索引的數據。整體結構茹下圖。
哈希算法以及rehash
- 哈希算法。首先,計算key的哈希值然后使用掩碼sizemask求得在table中的索引(例如, hash & sizemask),然后使用頭插法直接插入,使用鏈地址法解決哈希沖突。
- rehash。當哈希表的負載因子過大或者過小時,需要進行擴展以及壓縮,這個時候需要rehash,也就是需要重新計算當前值在新的table中的位置;擴展時,擴展為第一個大于等于ht[0].used*2的2的n次冪、壓縮時,壓縮為第一個大于等于ht[0].used的2的n次冪;負載因子等于used/size,當當前正在進行持久化時(BGSAVE或者BGREWRITEAOF),負載因子大于等于5擴展,平常選擇1,當負載因子小于0.1時,進行壓縮。rehash時,查詢操作,先到ht[0]中查詢,如果沒有再去ht[1]中查詢,插入新數據時,直接在ht[1]中插入。rehashidx默認為-1,當rehash時,保存的為正在轉移的ht[0]中table的索引。
本文為《Redis設計與實現》閱讀筆記
總結
以上是生活随笔為你收集整理的Redis笔记之基本数据结构 字典的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS的条形码和二维码生成
- 下一篇: LINQ能不能用系列(二)LINQ to