《閑扯Redis四》List數據類型底層編碼轉換



一、前言

Redis 提供了5種數據類型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合),理解每種數據類型的特點對於redis的開發和運維非常重要。

原文解析

Redis五種數據類型

Redis 中的 list 是我們經常使用到的一種數據類型,根據使用方式的不同,可以應用到很多場景中。

二、編碼轉換

 上節《閑扯Redis三》Redis五種數據類型之List型 中說道,List類型有兩種實現方式:

1、使用壓縮列表(ziplist)實現的列表對象
2、使用雙端鏈表(linkedlist)實現的列表對象

 並且,留下了一個疑問?Redis列表什么時候會使用 ziplist 編碼,什么時候又會使用 linkedlist 編碼呢?

Redis五種數據類型

參見了《Redis設計與實現》,得出了一個結論: ziplistlinkedlist 之間存在着一種編碼轉換機制,當列表對象可以同時滿足下列兩個條件時,列表對象采用ziplist編碼,否則采用linkedlist編碼

(1)列表對象保存的所有字符串元素的長度都小於64字節;

(2)列表元素保存的元素數量小於512個;

注意 :以上兩個條件的上限值可以在配置文件中修改 list-max-ziplist-value 選項和 list-max-ziplist-entries 選項,另外對於使用 ziplist 編碼的列表對象,當以上兩個條件中任何一個不能滿足時,對象的編碼轉換操作就會執行,原本保存在壓縮列表里面的所有列表元素都會被轉移並保存到雙端鏈表里面,對象的編碼也從 ziplist 變為 linkedlist

Redis五種數據類型

三、操作驗證

 書中是這樣說的,但是還是要自己操作驗證一下的,go!

Redis五種數據類型

 咦,什么鬼,不是說 ziplistlinkedlist ,還有編碼轉換嗎,咋一個都不是,這個 quicklist 是什么結構?看到這大家可能有一點懵逼,細品之后甚至想要動手:七哥,你TM是不是在忽悠我?

Redis五種數據類型

 嗯,這個不要急,聽我繼續嗶嗶( 假裝冷靜

Redis五種數據類型

 先來看一下操作的redis的版本:

./redis-server --version

 版本顯示:

Redis五種數據類型

再看一下,黃建宏老師《Redis設計與實現》第二版中對應的redis版本:3.0,查閱資料發現 redis 在 3.2 版本的時候,考慮到redis的空間存儲效率和時間效率,引入了quicklist(快速列表)作為 list 的底層實現,原來是這樣啊!

Redis五種數據類型

這就能說的通了,哈哈哈,下節咱們就來看看這個 quicklist 究竟是個什么啥,前面針對 3.0 版本的分析,看都看了,還能怎么辦呢,權當做個了解了!

四、要點總結

(1)(Redis 3.2 版本前)列表對象底層實現的方式,壓縮列表(ziplist)與雙端鏈表(linkedlist)存在轉換

(2)(Redis 3.2 版本前)同時滿足兩個條件:列表對象保存的所有字符串元素的長度都小於64字節;列表元素保存的元素數量小於512個;列表對象采用 ziplist 編碼,否則采用 linkedlist 編碼

(3)(Redis 3.2 版本)考慮到 Redis 的空間存儲效率和時間效率,引入了 quicklist(快速列表)作為 list 的底層實現

下節繼續...

Redis五種數據類型


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM