Redis學(xué)習(xí)筆記:list類型內(nèi)部編碼及其應(yīng)用場景

一、概述

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

在Redis中,可以對列表兩端插入(push)和彈出(pop),還可以獲取指定范圍的元素列表、獲取指定索引下標(biāo)的元素等。列表是一種比較靈活的數(shù)據(jù)結(jié)構(gòu),可以充當(dāng)棧和隊列的角色,在實(shí)際開發(fā)中有很多應(yīng)用場景。

列表類型有以下特點(diǎn):

  • 列表中的元素是有序的,即可以通過索引下標(biāo)獲取某個元素或者某個范圍內(nèi)的元素列表;

  • 列表中的元素可以是重復(fù)的;

二、常用命令

1.添加操作:

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

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

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

2.查找操作:

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

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

  • llen key:獲取列表長度;

3.刪除操作:

  • lpop key :從列表左側(cè)彈出元素;

  • rpop key :從列表右側(cè)彈出元素;

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

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

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

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

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

4.修改操作:

  • lset key index newValue:修改指定下標(biāo)的元素

5.阻塞操作:

阻塞式彈出:

  • blpop key [key ...] timeout

  • brpop key [key....] timeout

三、內(nèi)部編碼

列表類型的內(nèi)部編碼有兩種,分別如下:

  • ziplist(壓縮列表):當(dāng)列表的元素個數(shù)小于list -max-ziplist-entries配置(默認(rèn)512個),同時列表中每個元素的值都小于list-max-ziplist-value配置(默認(rèn)64字節(jié)),Redis會選用ziplist來作為列表的內(nèi)部實(shí)現(xiàn)來減少內(nèi)存的使用;

  • linkedlist(鏈表):當(dāng)列表類型無法滿足ziplist的條件時,Redis會使用linkedlist作為列表的內(nèi)部實(shí)現(xiàn);

  • quicklist:Redis3.2版本提供了quicklist內(nèi)部編碼,是以一個zpilist為節(jié)點(diǎn)的linkedlist,結(jié)合了ziplist和linkedlist兩者的優(yōu)勢,為列表類型提供了一種更為優(yōu)秀的內(nèi)部編碼實(shí)現(xiàn)。

四、應(yīng)用場景

1.消息隊列:

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

消息隊列.png

2.文章列表:

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

3.應(yīng)用場景總結(jié):

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

  • lpush + lpop = Stack(棧)

  • lpush + rpop = Queue(隊列)

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

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

感謝閱讀~

參考資料:


《Redis開發(fā)與運(yùn)維》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容