1. 程式人生 > 其它 >快速整明白Redis中的字典到底是個啥

快速整明白Redis中的字典到底是個啥

字典簡介

字典是一種用於儲存鍵值對的資料結構,可以通過鍵值對中的鍵快速地查詢到對應的值。在Redis所使用的C語言中,並沒有內建字典,所以Redis自己實現了字典。

整個Redis資料庫的所有的鍵和值就組成了一個全域性的字典,對資料庫的增刪改查操作都是構建在字典的操作之上的。

字典還是Redis的基本資料型別雜湊(hash)的底層實現之一,當雜湊資料型別的鍵和值的長度較大或者鍵值對數量較多的時候,Redis就會把字典作為雜湊資料型別的底層實現。

字典還是Redis的基本資料型別有序集合(zset)的底層實現之一,當有序集合中的所有元素的成員長度較長或者元素個數較多的時候,Redis就會把跳躍表和雜湊表作為有序集合的內部實現。

字典的實現

在Redis中的字典是由dict結構表示的,其底層實現使用了雜湊表,一個雜湊表包含多個雜湊表結點,每一個雜湊表結點都儲存了字典中的一個鍵值對。下面我們一個一個地詳細瞭解一下。

字典結構

字典是由dict結構表示的,它包含以下幾個屬性:

  • type屬性:一個指向dictType結構的指標,每個dictType結構都儲存了一套針對其特定型別鍵值對操作的函式。
  • privdata屬性:儲存了需要傳給其特定型別函式的可選引數。
  • ht屬性:一個包含兩個項的陣列,每一項都是一個雜湊表。一般情況下,字典只使用第一個雜湊表,只由在重新雜湊(rehash)的時候才會用到第二個雜湊表。
  • rehashidx
    屬性:用於記錄重新雜湊(rehash)的進度,當沒有重新雜湊(rehash)的時候,它的值為-1。

其中,type屬性和privdata屬性組合以後,就可以針對不同型別的鍵值對做不同的處理操作,比如:計算雜湊值、複製鍵、複製值、對比鍵、銷燬鍵、銷燬值等等。

雜湊表

雜湊表使用dictht結構表示,它包含以下幾個屬性:

  • table屬性:一個雜湊表陣列,陣列中每個項都是指向雜湊表結點的指標,每一個雜湊表結點都儲存了字典中的一個鍵值對。
  • size屬性:雜湊表的大小,也是就是雜湊表陣列(table)的大小。
  • sizemask屬性:雜湊表大小掩碼,用於計算索引值,一直等於雜湊表大小(size)-1。
  • used屬性:雜湊表中已有結點的數量。

雜湊表結點

雜湊表結點使用dictEntry結構表示,它包含以下幾個屬性:

  • key屬性:用於儲存鍵值對中的鍵。
  • v屬性:用於儲存鍵值對中的值。它可以是一個指標,也可以是一個uint64_t的整數,也可以是一個int64_t的整數。
  • next屬性:一個指向下一個雜湊表結點的指標。當發生鍵衝突的時候,它可以把多個雜湊表結點連線起來,形成一個單向連結串列。

字典示例

說了這麼多,都比較抽象不容易理解,我們來舉個例子:

這就是一個字典的內部結構,其中有3個鍵值對,鍵分別是:萬、貓、學社。

最後,謝謝你這麼帥,還給我點贊關注

微信公眾號:萬貓學社

微信掃描二維碼

關注後回覆「電子書」

獲取12本Java必讀技術書籍