Redis學習筆記:list類型內部編碼及其應用場景

一、概述

Redis中列表(list)類型是用來存儲多個有序的字符串,列表中的每個字符串成為元素(element),一個列表最多可以存儲2^32 - 1個元素。

在Redis中,可以對列表兩端插入(push)和彈出(pop),還可以獲取指定范圍的元素列表、獲取指定索引下標的元素等。列表是一種比較靈活的數據結構,可以充當棧和隊列的角色,在實際開發中有很多應用場景。

列表類型有以下特點:

  • 列表中的元素是有序的,即可以通過索引下標獲取某個元素或者某個范圍內的元素列表;

  • 列表中的元素可以是重復的;

二、常用命令

1.添加操作:

  • rpush key value [value...]:從右邊插入元素;

  • lpush key value [value...]:從右邊插入元素;

  • linsert key before | after pivot value:向某個元素前/后插入元素,返回結果為當前列表長度;

2.查找操作:

  • lrange key start end:獲取指定范圍內的元素列表;如lrange key 0 -1,獲取列表全部元素;

  • lindex key index:獲取列表指定索引下標的元素,如lindex key -1,獲取最后一個元素;

  • llen key:獲取列表長度;

3.刪除操作:

  • lpop key :從列表左側彈出元素;

  • rpop key :從列表右側彈出元素;

  • lrem key count value:lrem命令會從列表中找到等于value的元素進行刪除,根據count的不同分為三種情況;

    • count>0,從左到右,刪除最多count個元素;

    • count<0,從右到左,刪除最多count絕對值個元素;

    • count=0,刪除所有元素。

  • ltrim key start end:按照索引范圍修建列表,相當于切片操作。

4.修改操作:

  • lset key index newValue:修改指定下標的元素

5.阻塞操作:

阻塞式彈出:

  • blpop key [key ...] timeout

  • brpop key [key....] timeout

三、內部編碼

列表類型的內部編碼有兩種,分別如下:

  • ziplist(壓縮列表):當列表的元素個數小于list -max-ziplist-entries配置(默認512個),同時列表中每個元素的值都小于list-max-ziplist-value配置(默認64字節),Redis會選用ziplist來作為列表的內部實現來減少內存的使用;

  • linkedlist(鏈表):當列表類型無法滿足ziplist的條件時,Redis會使用linkedlist作為列表的內部實現;

  • quicklist:Redis3.2版本提供了quicklist內部編碼,是以一個zpilist為節點的linkedlist,結合了ziplist和linkedlist兩者的優勢,為列表類型提供了一種更為優秀的內部編碼實現。

四、應用場景

1.消息隊列:

如下圖所示,Redis的lpush + brpop命令組合即可實現阻塞隊列,生產者客戶端使用lpush從列表左側插入元素,多個消費者客戶端使用brpop命令阻塞式的爭搶列表尾部的元素,多個客戶端保證了消費的負載均衡和高可用;

消息隊列.png

2.文章列表:

利用隊列FIFO的特性可以設計出最近文章列表功能或者指定特性的最新文章列表等,在設計文章列表時,應充分考慮其獲取操作的性能,如批量獲取操作、批量插入操作;

3.應用場景總結:

實際上列表的使用場景分舵,在選擇時可以參入如下策略:

  • lpush + lpop = Stack(棧)

  • lpush + rpop = Queue(隊列)

  • lpush + ltrim = Capped Collention(有限集合)

  • lpush + brpop = Message Queue(消息隊列)

感謝閱讀~

參考資料:


《Redis開發與運維》

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 參考來源 Redis的內存優化 Redis所有的數據都在內存中,而內存又是非常寶貴的資源。對于如何優化內存使用一直...
    秦漢郵俠閱讀 1,303評論 0 2
  • 列表(list)類型是用來存儲多個有序的字符串,一個列表最多可以儲存2^32 - 1個元素,列表是比較靈活的數據結...
    Audience0閱讀 301評論 0 0
  • Redis的內存優化 聲明:本文內容來自《Redis開發與運維》一書第八章,如轉載請聲明。 Redis所有的數據都...
    meng_philip123閱讀 18,929評論 2 29
  • 九月,樹葉的淺黃開始微微泛濫,我靜靜地坐在窗口,凌亂的萬千思緒隨著秋風逐漸蔓延,任憑風把記憶里所有的悲傷和快樂蕩得...
    最傷心的風閱讀 271評論 0 1
  • 我是大白,一只愛發呆的呆大白。 為什么用這個名字? Just like it!
    呆大白閱讀 259評論 0 0