面試官:Redis中基本的資料型別有哪些?
我:Redis的基本資料型別有:字串(string)、哈希(hash)、串列(list)、集合(set)、有序集合(zset),
面試官:哈希資料型別的內部實作方式是什么?
我還沉浸在上一個問題的沾沾自喜中,頓時表情凝固了,手心開始冒出冷汗,“這個,,沒有太深入了解”,我支支吾吾的說到,
面試官:回去等訊息吧,
這句話說的干凈利落,然后就沒有然后了,失敗是成功的媽媽,我不氣餒,決定馬上惡補一下,
哈希的編碼
哈希的編碼有兩種,分別是壓縮串列(ziplist)和哈希表(hashtable),當所有鍵值對的鍵和值的長度都小于hash-max-ziplist-value(默認為64位元組),并且鍵值對的數量小于hash-max-ziplist-entries(默認為512個)的時候,哈希就會使用壓縮串列作為編碼,否則使用哈希表作為編碼,
我們來舉個例子:
127.0.0.1:6379> hset one-more-hash name "萬貓學社"
(integer) 1
127.0.0.1:6379> hset one-more-hash gender "男"
(integer) 1
127.0.0.1:6379> object encoding one-more-hash
"ziplist"
此時,所有鍵值對的鍵和值的長度和鍵值對的數量都比較小,哈希使用壓縮串列作為編碼,我們再加入一個值比較大的鍵值對:
127.0.0.1:6379> hset one-more-hash introduce "Java領域優質創作者、CSDN博客專家認證"
(integer) 1
127.0.0.1:6379> object encoding one-more-hash
"hashtable"
此時,哈希的編碼由壓縮串列轉化為編碼,
當然,了解以上細節還沒能完全“征服”面試官,我們需要更深入一些:)
哈希的底層實作
當壓縮串列作為哈希的編碼時,有新的鍵值對加入到哈希資料型別中,先把鍵的壓縮串列節點添加到壓縮串列的末尾,然后再把值的壓縮串列節點添加到壓縮串列的末尾,
所以,在哈希資料型別的壓縮串列中,先加入的鍵值對在壓縮串列的頭部方向,后加入的鍵值對在壓縮串列的末尾方向;同一個鍵值對的兩個節點是緊挨在一起的,鍵的節點在前,值的節點在后,
壓縮串列使用更加緊湊的記憶體結構實作多個鍵值對的連續存盤,在節省記憶體方面比哈希表表現的更加優秀,
當哈希表作為哈希的編碼時,每個鍵值對都使用一個字典鍵值對保存,字典的每個鍵都是一個字串物件,物件中保存鍵值對的鍵;字典的每個值也都是一個字串物件,物件中保存鍵值對的值,
哈希表雖然沒有壓縮串列節省記憶體,但是它的讀寫時間復雜度為O(1),在時間效率方面比壓縮串列表現的更加優秀,
總結
哈希資料型別的內部實作有壓縮串列(ziplist)和哈希表(hashtable)兩種,當哈希資料型別的鍵和值的長度較小并且鍵值對數量較少時,使用壓縮串列作為內部實作,否則使用哈希表作為內部實作,
最后,謝謝你這么帥,還給我點贊和關注,
微信公眾號:萬貓學社
微信掃描二維碼
關注后回復「電子書」
獲取12本Java必讀技術書籍
作者:萬貓學社
出處:http://www.cnblogs.com/heihaozi/
著作權宣告:本文遵循 CC 4.0 BY-NC-SA 著作權協議,轉載請附上原文出處鏈接和本宣告,
微信掃描二維碼,關注萬貓學社,回復「電子書」,免費獲取12本Java必讀技術書籍,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/440982.html
標籤:Java
