發(fā)布訂閱
Redis提供了基于“發(fā)布/訂閱”模式的消息機制奖磁,此種模式下拾并,消息發(fā)布 者和訂閱者不進行直接通信蹦渣,發(fā)布者客戶端向指定的頻道(channel)發(fā)布消 息,訂閱該頻道的每個客戶端都可以收到該消息
Redis主要提供了發(fā)布消息樟蠕、訂閱頻道贮聂、取消訂閱以及按照模式訂閱和取消訂閱等命令
1.發(fā)布消息
publish channel message
下面操作會向channel:sports頻道發(fā)布一條消息“Tim won the championship”,返回結(jié)果為訂閱者個數(shù)寨辩,因為此時沒有訂閱吓懈,所以返回結(jié)果 為0
127.0.0.1:6379> publish channel:sports "Tim won the championship"?
(integer) 0
2.訂閱消息
subscribe channel [channel ...]
訂閱者可以訂閱一個或多個頻道,下面操作為當(dāng)前客戶端訂閱了 channel:sports頻道:
127.0.0.1:6379> subscribe channel:sports?
Reading messages... (press Ctrl-C to quit)?
1) "subscribe"?
2) "channel:sports"?
3) (integer) 1
此時另一個客戶端發(fā)布一條消息:
127.0.0.1:6379> publish channel:sports "James lost the championship"?
(integer) 1
當(dāng)前訂閱者客戶端會收到如下消息:
127.0.0.1:6379> subscribe channel:sports?
Reading messages... (press Ctrl-C to quit) ...?
1) "message"?
2) "channel:sports"?
3) "James lost the championship"
如果有多個客戶端同時訂閱了channel:sports會同時收到信息
兩點需要注意:
·客戶端在執(zhí)行訂閱命令之后進入了訂閱狀態(tài)靡狞,只能接收subscribe骄瓣、 psubscribe、unsubscribe耍攘、punsubscribe的四個命令。
·新開啟的訂閱客戶端畔勤,無法收到該頻道之前的消息蕾各,因為Redis不會對發(fā)布的消息進行持久化。
3.取消訂閱
unsubscribe [channel [channel ...]]
127.0.0.1:6379> unsubscribe channel:sports
4.按照模式訂閱和取消訂閱
psubscribe pattern [pattern...] punsubscribe [pattern [pattern ...]]
除了subcribe和unsubscribe命令庆揪,Redis命令還支持glob風(fēng)格的訂閱命令 psubscribe和取消訂閱命令punsubscribe式曲,例如下面操作訂閱以it開頭的所有頻道:
127.0.0.1:6379> psubscribe it*
5.查詢訂閱
(1)查看活躍的頻道
pubsub channels [pattern]
所謂活躍的頻道是指當(dāng)前頻道至少有一個訂閱者,其中[pattern]是可以指定具體的模式:
pubsub channels
(2)查看頻道訂閱數(shù)
pubsub numsub [channel ...]
當(dāng)前channel:sports頻道的訂閱數(shù)為2:
127.0.0.1:6379> pubsub numsub channel:sports
(3)查看模式訂閱數(shù)
pubsub numpat
當(dāng)前只有一個客戶端通過模式來訂閱:
127.0.0.1:6379> pubsub numpat
使用場景
聊天室、公告牌吝羞、服務(wù)之間利用消息解耦都可以使用發(fā)布訂閱模式兰伤,下 面以簡單的服務(wù)解耦進行說明
假如視頻管理員在視頻管理系統(tǒng)中對視頻信息進行了變更,希望及時通知給視頻服務(wù)端钧排,就可以采用發(fā)布訂閱的模式敦腔,發(fā)布視頻信息變化的消息到指定頻道,視頻服務(wù)訂閱這個頻道及時更新視頻信息恨溜,通過這種方式可以有效解決兩個業(yè)務(wù)的耦合性
·視頻服務(wù)訂閱video:changes頻道如下:
subscribe video:changes
·視頻管理系統(tǒng)發(fā)布消息到video:changes頻道如下:
publish video:changes "video1,video3,video5"
·當(dāng)視頻服務(wù)收到消息符衔,對視頻信息進行更新,如下所示:
for video in video1,video3,video5? ??
????????update {video}