雜湊物件的編碼可以是ziplist
或者hashtable
。
ziplist
編碼的雜湊物件使用壓縮列表作為底層實現, 每當有新的鍵值對要加入到雜湊物件時, 程式會先將儲存了鍵的壓縮列表節點推入到壓縮列表表尾, 然後再將儲存了值的壓縮列表節點推入到壓縮列表表尾, 因此:
舉個例子, 如果我們執行以下 hset 命令, 那麼伺服器將建立乙個列表物件作為profile
鍵的值:
redis> hset profile name "如果tom"
(integer)
1redis> hset profile age 25
(integer)
1redis> hset profile career "
programmer
"(integer)
1
profile
鍵的值物件使用的是ziplist
編碼, 那麼這個值物件將會是圖 8-9 所示的樣子, 其中物件所使用的壓縮列表如圖 8-10 所示。
另一方面,hashtable
編碼的雜湊物件使用字典作為底層實現, 雜湊物件中的每個鍵值對都使用乙個字典鍵值對來儲存:
舉個例子, 如果前面profile
鍵建立的不是ziplist
編碼的雜湊物件, 而是hashtable
編碼的雜湊物件, 那麼這個雜湊物件應該會是圖 8-11 所示的樣子。
當雜湊物件可以同時滿足以下兩個條件時, 雜湊物件使用ziplist
編碼:
雜湊物件儲存的所有鍵值對的鍵和值的字串長度都小於64
位元組;
雜湊物件儲存的鍵值對數量小於512
個;
不能滿足這兩個條件的雜湊物件需要使用hashtable
編碼。
注意這兩個條件的上限值是可以修改的, 具體請看配置檔案中關於hash-max-ziplist-value
選項和hash-max-ziplist-entries
選項的說明。
對於使用ziplist
編碼的列表物件來說, 當使用ziplist
編碼所需的兩個條件的任意乙個不能被滿足時, 物件的編碼轉換操作就會被執行: 原本儲存在壓縮列表裡的所有鍵值對都會被轉移並儲存到字典裡面, 物件的編碼也會從ziplist
變為hashtable
。
以下**展示了雜湊物件因為鍵值對的鍵長度太大而引起編碼轉換的情況:
# 雜湊物件只包含乙個鍵和值都不超過 64除了鍵的長度太大會引起編碼轉換之外, 值的長度太大也會引起編碼轉換, 以下**展示了這種情況的乙個示例:個位元組的鍵值對
redis> hset book name "
mastering c++ in 21 days
"(integer)
1redis>object encoding book
"ziplist
"# 向雜湊物件新增乙個新的鍵值對,鍵的長度為
66位元組
redis> hset book long_long_long_long_long_long_long_long_long_long_long_description "
content
"(integer)
1# 編碼已改變
redis>object encoding book
"hashtable
"
# 雜湊物件只包含乙個鍵和值都不超過 64最後, 以下**展示了雜湊物件因為包含的鍵值對數量過多而引起編碼轉換的情況:個位元組的鍵值對
redis> hset blah greeting "
hello world
"(integer)
1redis>object encoding blah
"ziplist
"# 向雜湊物件新增乙個新的鍵值對,值的長度為
68位元組
redis> hset blah story "
many string ... many string ... many string ... many string ... many
"(integer)
1# 編碼已改變
redis>object encoding blah
"hashtable
"
# 建立乙個包含 512個鍵值對的雜湊物件
redis> eval "
for i=1, 512 do redis.call('hset', keys[1], i, i) end"1
"numbers
"(nil)
redis>hlen numbers
(integer)
512redis>object encoding numbers
"ziplist
"# 再向雜湊物件新增乙個新的鍵值對,使得鍵值對的數量變成
513個
redis> hmset numbers "
key"
"value"ok
redis>hlen numbers
(integer)
513# 編碼改變
Redis 物件 雜湊物件
每種型別的變數至少使用了兩種不同的編碼 1 五種物件的底層編碼 字串型別物件 redis encoding int redis encoding embstr redis encoding raw 列表型別的物件 redis encoding ziplist redis encoding linke...
《Redis 雜湊物件》
一 概述 redis 原始碼版本為3.0.0.redis 雜湊命令請戳。object encoding key 檢視資料底層型別實現。二 總結 使用 hash 時 控制資料大小,盡量不要寫入 不要超過 hash max ziplist value配置的位元組。控制雜湊內的個數,盡量不要寫入 不要超過...
Redis 雜湊物件和集合物件
雜湊物件編碼實現為ziplist或hashtable ziplist ziplist作為雜湊物件底層實現時,當有新兼職加入雜湊物件,則會儲存鍵的列表節點放到表尾,再兌入值得列表節點。即儲存同一鍵值對節點總是相鄰,儲存鍵的節點在前,儲存值的節點在後。先新增到雜湊物件中的鍵值對會放在列表表尾。使用zip...