一.Redis實現隊列redis
以前說了,使用lpush 配合rpop 或者rpush配合lpop就能實現隊列了.Redis提供了一個方法能夠阻塞等待,若是隊列裏面是空的就阻塞等待.shell
生產者:ui
localhost:6379> lpush queue 5 4 3 2 1
(integer) 5
消費者:spa
localhost:6379> BRPOP queue 0 1) "queue" 2) "5" (67.95s) localhost:6379> BRPOP queue 0 1) "queue" 2) "4" localhost:6379> BRPOP queue 0 1) "queue" 2) "3" localhost:6379> BRPOP queue 0 1) "queue" 2) "2" localhost:6379> BRPOP queue 0 1) "queue" 2) "1" localhost:6379> BRPOP queue 0
brpop key timecode
time爲阻塞等待的時間,0表示無限等待隊列
隊列 queue裏面是空的,則會阻塞等待.因爲設置的時間爲無限等.it
Redis在取隊列的時候支持優先級.class
生產者:
channel
localhost:6379> lpush queue:1 5 4 (integer) 2 localhost:6379> lpush queue:2 2 1 0 (integer) 3
消費者:queue
localhost:6379> brpop queue:1 queue:2 10 1) "queue:1" 2) "5" localhost:6379> brpop queue:1 queue:2 10 1) "queue:1" 2) "4" localhost:6379> brpop queue:1 queue:2 10 1) "queue:2" 2) "2" localhost:6379> brpop queue:1 queue:2 10 1) "queue:2" 2) "1" localhost:6379> brpop queue:1 queue:2 10 1) "queue:2" 2) "0" localhost:6379> brpop queue:1 queue:2 10 (nil) (10.32s)
brpop後面放多個隊列的時候 前面的隊列優先級高.會先取出前面的隊列以後在取後面的隊列.
二.發佈/訂閱
全部訂閱者均可以收到發佈者的內容.也是利用redis的列表實現的.可是發佈者發佈的內容不會被存儲下來,因此若是channel中沒有訂閱者,則消息直接丟失.
發佈者:
localhost:6379> publish channel hi (integer) 0
因爲這個時候channel尚未訂閱者,因此返回的結果是0.
訂閱者:
localhost:6379> subscribe channel Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "channel" 3) (integer) 1
這樣每次發佈者發佈消息以後,全部對這個channel訂閱的訂閱者都能收到消息.