一、概述
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ù)載均衡和高可用;

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)維》