Redis提供了 基于 “發(fā)布/訂閱”模式的消息機制馋吗,此種模式下朴上,消息發(fā)布者和訂閱者不進行直接通信,發(fā)布者客戶端向指定的頻道(Channel)發(fā)布消息蔑赘,該頻道的每個客戶端都可以收到該消息式矫,如圖3-16所示乡摹。Redis提供了若干命令支持該功能,在實際應用開發(fā)時衷佃,能夠為此類問題提供實現(xiàn)方法趟卸。
命令
Redis主要提供了 發(fā)布消息、訂閱頻道氏义、取消訂閱以及 按照模式訂閱和取消訂閱等命令锄列。
1.發(fā)布消息
命令格式如下:
publish channel message
例如,向channel:sports 頻道發(fā)布一條消息"Tom won the champion"惯悠,返回的結果為訂閱者個數(shù)邻邮。
publish channel:sports "Tom won the champion"
2.訂閱消息
命令格式如下:
subscribe channel [channel ...]
訂閱者可以訂閱一個或多個頻道,下面操作為當前客戶端訂閱了 channel:sports 頻道:
subscribe channel:sports
注意:新開啟的訂閱客戶端克婶,無法收到該頻道之前的消息筒严,因為Redis不會對發(fā)布的消息進行持久化丹泉。
和許多專業(yè)的消息隊列相比(例如Kafka、RocketMQ)相比鸭蛙,Redis的發(fā)布-訂閱略顯粗糙摹恨,例如無法實現(xiàn)消息堆積和回溯。
3.取消訂閱
命令格式如下:
unsubscribe channel [channel ...]
客戶端可以通過unsubscribe 命令取消對指定頻道的訂閱娶视,取消成功后不會再收到該頻道的發(fā)布消息:
unsubscribe channel:sports
4.按照模式訂閱和取消訂閱
命令格式:
psubscribe pattern
punsubscribe pattern
除了subscribe和unsubscribe 命令晒哄,Redis還支持glob風格的訂閱命令psubscribe 和取消訂閱命令punsubscribe ,例如下面操作訂閱 以 it開頭的所有頻道:
psubscribe it*
5.查詢訂閱
1肪获、查看活躍的頻道
pubsub channels [pattern ]
所謂活躍的頻道是指當前頻道至少有一個訂閱者寝凌,如下:
pubsub channels
指定pattern :
pubsub channels channel:*r*
2、查看訂閱頻道數(shù)
pubsub numsub [channel ...]
3孝赫、查看訂閱模式
pubsub numpat
Jedis Publish/Subscribe
添加maven依賴:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
Jedis訂閱 channel:sports頻道较木,代碼如下:
class MyListener extends JedisPubSub {
public void onMessage(String channel, String message) {
}
public void onSubscribe(String channel, int subscribedChannels) {
}
public void onUnsubscribe(String channel, int subscribedChannels) {
}
public void onPSubscribe(String pattern, int subscribedChannels) {
}
public void onPUnsubscribe(String pattern, int subscribedChannels) {
}
public void onPMessage(String pattern, String channel,
String message) {
}
}
MyListener l = new MyListener();
jedis.subscribe(l, "channel:sports");