Redis知識梳理 31 緊湊列表

2021-09-22 01:50:42 字數 1813 閱讀 2646

redis 5.0 又引入了乙個新的資料結構 listpack,它是對 ziplist 結構的改進,在 儲存空間上會更加節省,而且結構上也比 ziplist 要精簡。它的整體形式和 ziplist 還是比較接近的,如果你認真閱讀了 ziplist 的內部結構分析,那麼 listpack 也是比較容易理解的。 struct

首先這個 listpack 跟 ziplist 的結構幾乎一摸一樣,只是少了乙個 zltail_offset 字段。

ziplist 通過這個欄位來定位出最後乙個元素的位置,用於逆序遍歷。

不過 listpack 可以通過其它方式來定位出最後乙個元素的位置,所以 zltail_offset 欄位就省掉了。

​ struct lpentry

元素的結構和 ziplist 的元素結構也很類似,都是包含三個字段。不同的是長度 字段放在了元素的尾部,而且儲存的不是上乙個元素的長度,是當前元素的長 度。正是因為長度放在了尾部,所以可以省去了 zltail_offset 欄位來標記最後 乙個元素的位置,這個位置可以通過 total_bytes 欄位和最後乙個元素的長度字 段計算出來。

長度字段使用 varint 進行編碼,不同於 skiplist 元素長度的編碼為 1 個位元組或 者 5 個位元組,listpack 元素長度的編碼可以是 1、2、3、4、5 個位元組。同 utf8 編碼一樣,它通過位元組的最高為是否為 1 來決定編碼的長度。

同樣,redis 為了讓 listpack 元素支援很多態別,它對 encoding 欄位也進行了 較為複雜的設計。

\1. 0******x 表示非負小整數,可以表示 0~127 。

\2. 10****** 表示小字串,長度範圍是 0~63 , content 欄位為字串的內 容。

\3. 110***xx yyyyyyyy 表示有符號整數,範圍是 -2048~2047 。

\4. 1110***x yyyyyyyy 表示中等長度的字串,長度範圍是 0~4095 , content 欄位為字串的內容。

\5. 11110000 aaaaaaaa bbbbbbbb cccccccc dddddddd 表示大字串,四個位元組表示長度, content 欄位為字串內容。

\6. 11110001 aaaaaaaa bbbbbbbb 表示 2 位元組有符號整數。

\7. 11110010 aaaaaaaa bbbbbbbb cccccccc 表示 3 位元組有符號整數。

\8. 11110011 aaaaaaaa bbbbbbbb cccccccc dddddddd 表示 4 位元組有符號整數。

\9. 11110011 aaaaaaaa … hhhhhhhh 表示 8 位元組有符號整數。

\10. 11111111 表示 listpack 的結束符號,也就是 0xff 。

listpack 的設計徹底消滅了 ziplist 存在的級聯更新行為,元素與元素之間完全獨 立,不會因為乙個元素的長度變長就導致後續的元素內容會受到影響。

listpack 的設計的目的是用來取代 ziplist,不過當下還沒有做好替換 ziplist 的 準備,因為有很多相容性的問題需要考慮,ziplist 在 redis 資料結構中使用太廣 泛了,替換起來複雜度會非常之高。它目前只使用在了新增加的 stream 資料結 構中。

高階 Redis 知識梳理

1 什麼是nosql nosql 統稱 泛指非關係型的資料庫,nosql即not only sql,它可以作為關係型資料庫的良好補充。2 nosql資料庫的四大分類如下 鍵值 key value 儲存資料庫 相關產品 tokyo cabinet tyrant redis voldemort berk...

知識梳理 3 1頁面布局

題目 假設高度已知,請寫出三欄布局,其中左欄 右欄各為300px,中間自適應。1.這是三欄布局的中間部分 2.這是三欄布局的中間部分 3.這是三欄布局的中間部分 4.這是三欄布局的中間部分 5.這是三欄布局的中間部分 6.這是三欄布局的中間部分 1.這是三欄布局的中間部分 2.這是三欄布局的中間部分...

redis知識點梳理

微博點贊,收藏,標籤 關注模型 zset set集合運算 zset集合運算 在jedis中分布式鎖實現 依然無法解決機率鎖失效的問題 public string lock int stock integer.parseint stringredistemplate.opsforvalue get s...