列表物件的編碼可以是ziplist
或者linkedlist
。
ziplist
編碼的列表物件使用壓縮列表作為底層實現, 每個壓縮列表節點(entry)儲存了乙個列表元素。
舉個例子, 如果我們執行以下 rpush 命令, 那麼伺服器將建立乙個列表物件作為numbers
鍵的值:
redis> rpush numbers 1如果"three"5
(integer)
3
numbers
鍵的值物件使用的是ziplist
編碼, 這個這個值物件將會是圖 8-5 所展示的樣子。
另一方面,linkedlist
編碼的列表物件使用雙端鍊錶作為底層實現, 每個雙端鍊錶節點(node)都儲存了乙個字串物件, 而每個字串物件都儲存了乙個列表元素。
舉個例子, 如果前面所說的numbers
鍵建立的列表物件使用的不是ziplist
編碼, 而是linkedlist
編碼, 那麼numbers
鍵的值物件將是圖 8-6 所示的樣子。
注意,linkedlist
編碼的列表物件在底層的雙端鍊錶結構中包含了多個字串物件, 這種巢狀字串物件的行為在稍後介紹的雜湊物件、集合物件和有序集合物件中都會出現, 字串物件是 redis 五種型別的物件中唯一一種會被其他四種型別物件巢狀的物件。
注意為了簡化字串物件的表示, 我們在圖 8-6 使用了乙個帶有stringobject
字樣的格仔來表示乙個字串物件, 而stringobject
字樣下面的是字串物件所儲存的值。
比如說, 圖 8-7 代表的就是乙個包含了字串值"three"
的字串物件, 它是 8-8 的簡化表示。
當列表物件可以同時滿足以下兩個條件時, 列表物件使用ziplist
編碼:
列表物件儲存的所有字串元素的長度都小於64
位元組;
列表物件儲存的元素數量小於512
個;
不能滿足這兩個條件的列表物件需要使用linkedlist
編碼。
注意以上兩個條件的上限值是可以修改的, 具體請看配置檔案中關於list-max-ziplist-value
選項和list-max-ziplist-entries
選項的說明。
對於使用ziplist
編碼的列表物件來說, 當使用ziplist
編碼所需的兩個條件的任意乙個不能被滿足時, 物件的編碼轉換操作就會被執行: 原本儲存在壓縮列表裡的所有列表元素都會被轉移並儲存到雙端鍊錶裡面, 物件的編碼也會從ziplist
變為linkedlist
。
以下**展示了列表物件因為儲存了長度太大的元素而進行編碼轉換的情況:
# 所有元素的長度都小於 64除此之外, 以下**展示了列表物件因為儲存的元素數量過多而進行編碼轉換的情況:位元組redis> rpush blah "
hello""
world""
again
"(integer)
3redis>object encoding blah
"ziplist
"# 將乙個
65位元組長的元素推入列表物件中
redis> rpush blah "
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
"(integer)
4# 編碼已改變
redis>object encoding blah
"linkedlist
"
# 列表物件包含 512個元素redis> eval "
for i=1,512 do redis.call('rpush', keys[1], i) end"1
"integers
"(nil)
redis>llen integers
(integer)
512redis>object encoding integers
"ziplist
"# 再向列表物件推入乙個新元素,使得物件儲存的元素數量達到
513個
redis> rpush integers 513
(integer)
513# 編碼已改變
redis>object encoding integers
"linkedlist
"
09 Redis 列表物件
本文內容均來自 redis設計與實現 一書 列表物件的編碼可以是ziplist或者linkedlist。ziplist編碼的列表物件使用壓縮列表作為底層實現,每個壓縮列表節點儲存乙個列表元素。linkedlist編碼的列表物件使用雙端鍊錶作為底層實現,每個雙端鍊錶節點都儲存了乙個字串物件,而每個字串...
Redis閱讀筆記 列表物件
列表物件的編碼可以是ziplist或linkedlist。ziplist編碼的列表物件使用壓縮表作為底層實現,每個壓縮表節點 entry 儲存了乙個列表元素。舉個例子,若我們執行rpush命令,那麼伺服器將建立乙個列表物件作為numbers鍵的值 127.0.0.1 6379 rpush numbe...
Redis 資料結構與物件 壓縮列表
壓縮列表是列表鍵和雜湊鍵的底層實現之一 當乙個列表鍵只包含少量列表項,並且每個列表要麼就是小整數值,要麼就是長度比較短的字串,那麼使用壓縮列表作為底層實現 當乙個雜湊鍵只包含少量鍵值對,而且每個鍵值對的鍵和值要麼是小整數值要是就是長度比較短的字串,那麼底層實現是壓縮列表 壓縮列表是redis為了節約...