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