Redis 雜湊物件

2022-07-10 18:03:09 字數 2984 閱讀 3468

雜湊物件的編碼可以是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...