Redis隊列功能介紹
List
常用命令:
Blpop刪除,并獲得該列表中的第一元素,或阻塞,直到有一個可用
Brpop刪除,并獲得該列表中的最后一個元素,或阻塞,直到有一個可用
Brpoplpush
Lindex獲取一個元素,通過其索引列表
Linsert在列表中的另一個元素之前或之后插入一個元素
Llen獲得隊列(List)的長度
Lpop從隊列的左邊出隊一個元素
Lpush從隊列的左邊入隊一個或多個元素
Lpushx當(dāng)隊列存在時,從隊到左邊入隊一個元素
Lrange從列表中獲取指定返回的元素
Lrem從列表中刪除元素
Lset設(shè)置隊列里面一個元素的值
Ltrim修剪到指定范圍內(nèi)的清單
Rpop從隊列的右邊出隊一個元素
Rpoplpush刪除列表中的最后一個元素,將其追加到另一個列表
Rpush從隊列的右邊入隊一個元素
Rpushx從隊列的右邊入隊一個元素,僅隊列存在時有效
?
Redis支持php、python、c等接口
?
?
?
?
?
?
?
?
應(yīng)用場景:
Redis?list的應(yīng)用場景非常多,也是Redis最重要的數(shù)據(jù)結(jié)構(gòu)之一,比如的關(guān)注列表,粉絲列表等都可以用Redis的list結(jié)構(gòu)來實現(xiàn)。
Lists?就是鏈表,相信略有數(shù)據(jù)結(jié)構(gòu)知識的人都應(yīng)該能理解其結(jié)構(gòu)。使用Lists結(jié)構(gòu),我們可以輕松地實現(xiàn)最新消息排行等功能。
Lists的另一個應(yīng)用就是消息隊列,
可以利用Lists的PUSH操作,將任務(wù)存在Lists中,然后工作線程再用POP操作將任務(wù)取出進(jìn)行執(zhí)行。Redis還提供了操作Lists中某一段的api,你可以直接查詢,刪除Lists中某一段的元素。
?
如果需要還可以用redis的Sorted-Sets數(shù)據(jù)結(jié)構(gòu)來做優(yōu)先隊列.可以給每條消息加上一個唯一的序號。這里就不詳細(xì)介紹了。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
實現(xiàn)方式:
Redis?list的實現(xiàn)為一個雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過帶來了部分額外的內(nèi)存開銷,Redis內(nèi)部的很多實現(xiàn),包括發(fā)送緩沖隊列等也都是用的這個數(shù)據(jù)結(jié)構(gòu)。
??
?
?
?
?
?
?
?
?
?
?
?
示意圖:
1)入隊
?
?
?
?
?
?
?
?
?
?
?
2)出隊(非阻塞模式)
?
?
lpop彈出列表首元素(即最后入隊的元素)
?
?
?
?
?
?
Rpop彈出列表尾元素?(即入隊的最開始的一個元素)
注意:如果要當(dāng)作隊列功能,應(yīng)該是用這個出隊
?
?
這里的出隊都是非阻塞模式,就是你用pop出隊的時候,如果隊列是空的話,你得到的是一個NULL的值
?
?
?
?
?
?
?
?
?
?
?
3)出隊(阻塞模式)
假如現(xiàn)在queue隊列為空??我們用brpop命令
?是一個阻塞的列表彈出原語。?它是??的阻塞版本,因為這個命令會在給定list無法彈出任何元素的時候阻塞連接。?該命令會按照給出的?key?順序查看?list,并在找到的第一個非空?list?的尾部彈出一個元素。
?
?
?
?
A)
我們執(zhí)行brpop命令
可以看到隊列queue沒有元素的時候??是阻塞的??即不返回值????
其中0是超時時間?為0表示一直等待
?
B)
這個時候我們用lpush往隊列里?入隊一個數(shù)據(jù)“bbb”
?
C)
阻塞的隊列立馬會彈出出隊元素???顯示隊列名字??和?出隊元素??已經(jīng)等待了多少時間
?
D)
Brpop還能同時阻塞多個隊列比如這樣
?
?
?
?
用redis的list當(dāng)作隊列可能存在的問題
1)redis崩潰的時候隊列功能失效
2)如果入隊端一直在塞數(shù)據(jù),而出隊端沒有消費(fèi)數(shù)據(jù),或者是入隊的頻率大而多,出隊端的消費(fèi)頻率慢會導(dǎo)致內(nèi)存暴漲
3)Redis的隊列也可以像rabbitmq那樣??即可以做消息的持久化,也可以不做消息的持久化。
當(dāng)做持久話的時候,需要啟動redis的dump數(shù)據(jù)的功能.暫時不建議開啟持久化。
?
Redis其實只適合作為緩存,而不是數(shù)據(jù)庫或是存儲。它的持久化方式適用于救救急啥的,不太適合當(dāng)作一個普通功能來用。應(yīng)為dump時候,會影響性能,數(shù)據(jù)量小的時候還看不出來,當(dāng)數(shù)據(jù)量達(dá)到百萬級別,內(nèi)存10g左右的時候,非常影響性能。
?
4)假如有多個消費(fèi)者同時監(jiān)聽一個隊列,其中一個出隊了一個元素,另一個則獲取不到該元素
5)Redis的隊列應(yīng)用場景是一對多或者一對一的關(guān)系,即有多個入隊端,但是只有一個消費(fèi)端(出隊)
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
PHP的redis?簡單操作示例
?