一、概述
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命令阻塞式的爭搶列表尾部的元素,多個客戶端保證了消費的負載均衡和高可用;
2.文章列表:
利用隊列FIFO的特性可以設計出最近文章列表功能或者指定特性的最新文章列表等,在設計文章列表時,應充分考慮其獲取操作的性能,如批量獲取操作、批量插入操作;
3.應用場景總結:
實際上列表的使用場景分舵,在選擇時可以參入如下策略:
lpush + lpop = Stack(棧)
lpush + rpop = Queue(隊列)
lpush + ltrim = Capped Collention(有限集合)
lpush + brpop = Message Queue(消息隊列)
感謝閱讀~
參考資料:
《Redis開發與運維》