列表(list)類型是用來存儲多個有序的字符串,一個列表最多可以儲存2^32 - 1個元素,列表是比較靈活的數據結構,它可以充當棧和隊列的角色。
列表類型特點:
? ? 1.列表中的元素是有序的,這就意味著可以通過索引下標獲取某個元素或者某個范圍內的元素。
? ? 2.列表中的元素可以是重復的
命令:
插入:
-- 從右邊插入
rpush key value [value ...]
-- 從左側插入
lpush key value [value...]
-- 向某個元素前或后插入元素
linsert key before|after element value
linsert 命令會從列表中找到等于element的元素,在其前或者后插入一個新的元素value
查找:
-- 獲取指定范圍內的元素列表
lrange key start end?
lrange 操作會獲取列表指定索引范圍的所有元素。索引下標從左到右分別是0 ~ N-1, 并且 lrange的end包含本身?
-- 獲取列表指定索引下標的元素
lindex key index
獲取最后一個元素可以為lindex key -1
-- 獲取列表長度
llen key
刪除:
--從列表左側彈出元素
lpop key?
--從列表有測彈出元素
rpop key
--刪除指定元素
lrem key count value
lrem命令會從列表中找到等于value的元素進行刪除,根據count的不同分為三種情況,
count? > 0 從左到右,刪除最多count個元素
count < 0 從右到左,刪除最多count絕對值個元素
count = 0 刪除所有
-- 按照索引范圍修剪列表
ltrim key start end?
ltrim操作會使列表保留start--end之間的元素,包含start? end對應的元素
修改:
-- 修改指定索引下標的元素
lset key index newValue
阻塞:
-- 阻塞式彈出
blpop key [key...] timeout
brpop key [key...] timeout
blpop和brpop是lpop和rpop的阻塞版本,
參數說明:
--key [key...] 多個列表的鍵
--timeout:阻塞時間(單位:秒)
? ? 列表為空:如果timeout=3,那么客戶端要等到3秒后返回,如果timeout=0,那么客戶端一直阻塞等下去,但是如果在阻塞期間,其他客戶端添加了數據,使列表不為空,則會立即返回
? ? 列表不為空,客戶端會立即返回
--在使用brpop時有兩點需要注意
? ? 第一點:如果多個鍵,那么brpop會從左至右遍歷鍵,一旦有一個鍵能彈出元素,客戶端變會立即返回,如果此時另一個客戶端向空列表中插入數據,客戶端會立即返回相應的列表彈出的元素。
? ? 第二點:如果多個客戶端對同一個鍵執(zhí)行brpop,那么最先執(zhí)行brpop命令的客戶端可以獲取到彈出的值

-- 內部編碼:
ziplist(壓縮列表):當列表的元素個數小于list-max-ziplist-entries配置(默認512個),同時列表中每個元素 的值都小于list-max-ziplist-value配置(默認64字節(jié)),Redis會選用ziplist來作為列表的內部實現,來減少內存的使用。
linkedlist(鏈表):當列表類型無法滿足ziplist的條件時,Redis會使用linkedlist作為列表的內部實現。
quicklist:Redis 3.2提供,是以一個ziplist為節(jié)點的linkedlist,參考微博:https://matt.sh/redis-quicklist
-- 使用實例
? ? 消息隊列:
????????????lpush+brpop組合可實現阻塞消息隊列,生產者客戶端使用lpush從列表左側插入元素,多個消費者客戶端從列表右側使用brpop命令阻塞式的搶列表尾部的元素,多個客戶端保證了消費者的負載均衡和高可用性。
? ? --------------------------------------------------------------------------------------------------------------------------------
lpush + lpop = stack(棧)
lpush + rpop = Queue(隊列)
lpush + ltrim = Capped Collection(有限集合)
lpush + brpop = Message Queue(消息隊列)