redis-list

列表用來存儲多個有序的字符串,列表中元素是能夠重複的,最多能夠存儲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會拋出異常,因此編寫客戶端消費者注意捕獲異常,還要重試。

相關文章
相關標籤/搜索