快速整明白Redis中的字典到底是個啥
阿新 • • 發佈:2022-03-17
字典簡介
字典是一種用於儲存鍵值對的資料結構,可以通過鍵值對中的鍵快速地查詢到對應的值。在Redis所使用的C語言中,並沒有內建字典,所以Redis自己實現了字典。
整個Redis資料庫的所有的鍵和值就組成了一個全域性的字典,對資料庫的增刪改查操作都是構建在字典的操作之上的。
字典還是Redis的基本資料型別雜湊(hash)的底層實現之一,當雜湊資料型別的鍵和值的長度較大或者鍵值對數量較多的時候,Redis就會把字典作為雜湊資料型別的底層實現。
字典還是Redis的基本資料型別有序集合(zset)的底層實現之一,當有序集合中的所有元素的成員長度較長或者元素個數較多的時候,Redis就會把跳躍表和雜湊表作為有序集合的內部實現。
字典的實現
在Redis中的字典是由dict
結構表示的,其底層實現使用了雜湊表,一個雜湊表包含多個雜湊表結點,每一個雜湊表結點都儲存了字典中的一個鍵值對。下面我們一個一個地詳細瞭解一下。
字典結構
字典是由dict
結構表示的,它包含以下幾個屬性:
-
type
屬性:一個指向dictType
結構的指標,每個dictType
結構都儲存了一套針對其特定型別鍵值對操作的函式。 -
privdata
屬性:儲存了需要傳給其特定型別函式的可選引數。 -
ht
屬性:一個包含兩個項的陣列,每一項都是一個雜湊表。一般情況下,字典只使用第一個雜湊表,只由在重新雜湊(rehash)的時候才會用到第二個雜湊表。 -
rehashidx
其中,type
屬性和privdata
屬性組合以後,就可以針對不同型別的鍵值對做不同的處理操作,比如:計算雜湊值、複製鍵、複製值、對比鍵、銷燬鍵、銷燬值等等。
雜湊表
雜湊表使用dictht
結構表示,它包含以下幾個屬性:
-
table
屬性:一個雜湊表陣列,陣列中每個項都是指向雜湊表結點的指標,每一個雜湊表結點都儲存了字典中的一個鍵值對。 -
size
屬性:雜湊表的大小,也是就是雜湊表陣列(table
)的大小。 -
sizemask
屬性:雜湊表大小掩碼,用於計算索引值,一直等於雜湊表大小(size
)-1。 -
used
屬性:雜湊表中已有結點的數量。
雜湊表結點
雜湊表結點使用dictEntry
結構表示,它包含以下幾個屬性:
-
key
屬性:用於儲存鍵值對中的鍵。 -
v
屬性:用於儲存鍵值對中的值。它可以是一個指標,也可以是一個uint64_t
的整數,也可以是一個int64_t
的整數。 -
next
屬性:一個指向下一個雜湊表結點的指標。當發生鍵衝突的時候,它可以把多個雜湊表結點連線起來,形成一個單向連結串列。
字典示例
說了這麼多,都比較抽象不容易理解,我們來舉個例子:
這就是一個字典的內部結構,其中有3個鍵值對,鍵分別是:萬、貓、學社。
最後,謝謝你這麼帥,還給我點贊和關注。
微信公眾號:萬貓學社
微信掃描二維碼
關注後回覆「電子書」
獲取12本Java必讀技術書籍