當前位置:成語大全網 - 新華字典 - redis多個數據庫內存怎麽分配的(redis壹個庫能存多少數據)

redis多個數據庫內存怎麽分配的(redis壹個庫能存多少數據)

1、redis中的每壹個數據庫,都由壹個redisDb的結構存儲。其中,redisDb.id存儲著redis數據庫以整數表示的號碼。redisDb.dict存儲著該庫所有的鍵值對數據。redisDb.expires保存著每壹個鍵的過期時間。

2、當redis服務器初始化時,會預先分配16個數據庫(該數量可以通過配置文件配置),所有數據庫保存到結構redisServer的壹個成員redisServer.db數組中。當我們選擇數據庫selectnumber時,程序直接通過redisServer.db[number]來切換數據庫。有時候當程序需要知道自己是在哪個數據庫時,直接讀取redisDb.id即可。

3、既然我們知道壹個數據庫的所有鍵值都存儲在redisDb.dict中,那麽我們要知道如果找到key的位置,就有必要了解壹下dict的結構了:

typedefstructdict{

//特定於類型的處理函數

dictType*type;

//類型處理函數的私有數據

void*privdata;

//哈希表(2個)

dicththt[2];

//記錄rehash進度的標誌,值為-1表示rehash未進行

intrehashidx;

//當前正在運作的安全叠代器數量

intiterators;

}dict;

由上述的結構可以看出,redis的字典使用哈希表作為其底層實現。dict類型使用的兩個指向哈希表的指針,其中0號哈希表(ht[0])主要用於存儲數據庫的所有鍵值,而1號哈希表主要用於程序對0號哈希表進行rehash時使用,rehash壹般是在添加新值時會觸發,這裏不做過多的贅述。所以redis中查找壹個key,其實就是對進行該dict結構中的ht[0]進行查找操作。

4、既然是哈希,那麽我們知道就會有哈希碰撞,那麽當多個鍵哈希之後為同壹個值怎麽辦呢?redis采取鏈表的方式來存儲多個哈希碰撞的鍵。也就是說,當根據key的哈希值找到該列表後,如果列表的長度大於1,那麽我們需要遍歷該鏈表來找到我們所查找的key。當然,壹般情況下鏈表長度都為是1,所以時間復雜度可看作o(1)。

二、當redis拿到壹個key時,如果找到該key的位置。

了解了上述知識之後,我們就可以來分析redis如果在內存找到壹個key了。

1、當拿到壹個key後,redis先判斷當前庫的0號哈希表是否為空,即:if(dict-

2、判斷該0號哈希表是否需要rehash,因為如果在進行rehash,那麽兩個表中者有可能存儲該key。如果正在進行rehash,將調用壹次_方法,_用於對數據庫字典、以及哈希鍵的字典進行被動rehash,這裏不作贅述。

3、計算哈希表,根據當前字典與key進行哈希值的計算。

4、根據哈希值與當前字典計算哈希表的索引值。

5、根據索引值在哈希表中取出鏈表,遍歷該鏈表找到key的位置。壹般情況,該鏈表長度為1。

6、當ht[0]查找完了之後,再進行了次rehash判斷,如果未在rehashing,則直接結束,否則對ht[1]重復345步驟。

到此我們就找到了key在內存中的位置了。