redis 學習筆記三(佇列功能)
Redis佇列功能介紹
List
常用命令:
Blpop刪除,並獲得該列表中的第一元素,或阻塞,直到有一個可用
Brpop刪除,並獲得該列表中的最後一個元素,或阻塞,直到有一個可用
Brpoplpush
Lindex獲取一個元素,通過其索引列表
Linsert在列表中的另一個元素之前或之後插入一個元素
Llen獲得佇列(List)的長度
Lpop從佇列的左邊出隊一個元素
Lpush從佇列的左邊入隊一個或多個元素
Lpushx當佇列存在時,從隊到左邊入隊一個元素
Lrange從列表中獲取指定返回的元素
Lrem從列表中刪除元素
Lset設定佇列裡面一個元素的值
Ltrim修剪到指定範圍內的清單
Rpop從佇列的右邊出隊一個元素
Rpoplpush刪除列表中的最後一個元素,將其追加到另一個列表
Rpush從佇列的右邊入隊一個元素
Rpushx從佇列的右邊入隊一個元素,僅佇列存在時有效
Redis支援php、python、c等介面
應用場景:
Redis list的應用場景非常多,也是Redis最重要的資料結構之一,比如twitter的關注列表,粉絲列表等都可以用Redis的list結構來實現。
Lists 就是連結串列,相信略有資料結構知識的人都應該能理解其結構。使用Lists結構,我們可以輕鬆地實現最新訊息排行等功能。
Lists的另一個應用就是訊息佇列,
可以利用Lists的PUSH操作,將任務存在Lists
如果需要還可以用redis的Sorted-Sets資料結構來做優先佇列.可以給每條訊息加上一個唯一的序號。這裡就不詳細介紹了。
實現方式:
Redis list的實現為一個雙向連結串列,即可以支援反向查詢和遍歷,更方便操作,不過帶來了部分額外的記憶體開銷,Redis內部的很多實現,包括髮送緩衝佇列等也都是用的這個資料結構。
示意圖:
1)入隊
2)出隊(非阻塞模式)
lpop彈出列表首元素(即最後入隊的元素)
Rpop彈出列表尾元素 (即入隊的最開始的一個元素)
注意:如果要當作佇列功能,應該是用這個出隊
這裡的出隊都是非阻塞模式,就是你用pop出隊的時候,如果佇列是空的話,你得到的是一個NULL的值
3)出隊(阻塞模式)
假如現在queue佇列為空 我們用brpop命令
BRPOP 是一個阻塞的列表彈出原語。 它是RPOP 的阻塞版本,因為這個命令會在給定list無法彈出任何元素的時候阻塞連線。 該命令會按照給出的 key 順序檢視 list,並在找到的第一個非空 list 的尾部彈出一個元素。
A)
我們執行brpop命令
可以看到佇列queue沒有元素的時候 是阻塞的 即不返回值
其中0是超時時間 為0表示一直等待
B)
這個時候我們用lpush往佇列裡 入隊一個數據“bbb”
C)
阻塞的佇列立馬會彈出出隊元素 顯示佇列名字 和 出隊元素 已經等待了多少時間
D)
Brpop還能同時阻塞多個佇列比如這樣
用redis的list當作佇列可能存在的問題
1)redis崩潰的時候佇列功能失效
2)如果入隊端一直在塞資料,而出隊端沒有消費資料,或者是入隊的頻率大而多,出隊端的消費頻率慢會導致記憶體暴漲
3)Redis的佇列也可以像rabbitmq那樣 即可以做訊息的持久化,也可以不做訊息的持久化。
當做持久話的時候,需要啟動redis的dump資料的功能.暫時不建議開啟持久化。
Redis其實只適合作為快取,而不是資料庫或是儲存。它的持久化方式適用於救救急啥的,不太適合當作一個普通功能來用。應為dump時候,會影響效能,資料量小的時候還看不出來,當資料量達到百萬級別,記憶體10g左右的時候,非常影響效能。
4)假如有多個消費者同時監聽一個佇列,其中一個出隊了一個元素,另一個則獲取不到該元素
5)Redis的佇列應用場景是一對多或者一對一的關係,即有多個入隊端,但是隻有一個消費端(出隊)
PHP的redis 簡單操作示例