列表用來存儲多個有序的字符串,列表中元素是能夠重複的,最多能夠存儲2^32-1個元素redis
經常使用命令:數據結構
lrange key start end 獲取指定範圍內的元素列表,索引從0開始 0,-1取出全部的元素app
lindex key index 獲取列表指定下標的元素負載均衡
ltrim key start end 截取數據異步
lrem key count value :從列表中找到等於value的元素進行刪除,根據count來進行區分,count >0 從左到右,最多刪除count元素,count =0 刪除全部,count <0,從右到左ui
lset key index value 修改數據編碼
rpush(從右邊插入元素),rpop(從右邊取出元素並刪除),lpush,rpushspa
阻塞操做:線程
blpop和brpol是lpop和rpop阻塞版本,timeout 阻塞時間索引
1)列表爲空:若是timeout =3,那麼客戶端等到3秒後返回,爲0,一直阻塞等待
2)列表不爲空:客戶端當即返回
注意事項:
若是有多個健,brpop會從左到右遍歷健,一但有一個健能彈出,當即返回
若是多個客戶端對同一個健brpop操做,那麼最早執行的brpop客戶端獲取彈出的值,若是是一直阻塞,未獲取到的就一直等待
內部編碼:
1.ziplist(壓縮列表),當列表類型元素小於list-max-ziplist-entries配置(默認521個),同時全部值都小於list-max-ziplist-value配置(默認64字節),redis會使用ziplist做爲內部實現,全部在節約內存方面比linkedlist優秀
2.linkedlist(鏈表),當沒法知足ziplist條件時候,redis會使用linkedlist做爲列表的內部實現(redis 3.2使用的quicklist)
使用場景:
消息隊列:lpush brpop 命令組合便可實現阻塞隊列,多個消費者客戶端使用brpop命令阻塞式的搶列表尾部的元素,多個客戶端保證了消費的高可用和負載均衡
文章列表:lpush +lrang key start end 獲取前多少文章
使用場景還有不少,小提示:
lpush+lpop = stack(棧)
lpush+rpop=quene(隊列)
lpush+ltrim = capped collection(有限集合)
lpush+brpop = message quene(消息隊列)
list 數據結構經常使用來做爲異步消息隊列使用,使用rpush/lpush 操做入隊列,使用lpop/rpop來出隊列
隊列空了怎麼辦?
客戶端是經過隊列pop獲取消息,而後進行處理,處理完後再接着獲取消息,再進行處理,如此循環往復,這即是做爲隊列消費者的客戶端的生命週期。
若是隊列空了,客戶端就會陷入pop的死循環,不停的pop,沒有數據,接着在pop,又沒有數據,這就是浪費生命的空輪詢。空輪詢不斷拉高客戶端的cpu,redis的qps也會拉高。blpop/brpop阻塞讀,阻塞讀在隊列沒有數據的時候,會當即進入休眠狀態,一旦數據到來,則馬上醒過來,消費的延遲幾乎爲0.
空鏈接自動斷開
若是線程一直阻塞,redis客戶端鏈接變成閒置鏈接,閒置太久,服務端通常會主動斷開鏈接,減小閒置資源佔用,這個時候blpop/brpop會拋出異常,因此編寫客戶端消費者注意捕獲異常,還要重試。