Redis 列表物件

2022-07-08 10:12:11 字數 2588 閱讀 2706

列表物件的編碼可以是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為了節約...