Redis提供了 基于 “发布/订阅”模式的消息机制,此种模式下,消息发布者和订阅者不进行直接通信,发布者客户端向指定的频道(Channel)发布消息,该频道的每个客户端都可以收到该消息,如图3-16所示。Redis提供了若干命令支持该功能,在实际应用开发时,能够为此类问题提供实现方法。
命令
Redis主要提供了 发布消息、订阅频道、取消订阅以及 按照模式订阅和取消订阅等命令。
1.发布消息
命令格式如下:
publish channel message
例如,向channel:sports 频道发布一条消息"Tom won the champion",返回的结果为订阅者个数。
publish channel:sports "Tom won the champion"
2.订阅消息
命令格式如下:
subscribe channel [channel ...]
订阅者可以订阅一个或多个频道,下面操作为当前客户端订阅了 channel:sports 频道:
subscribe channel:sports
注意:新开启的订阅客户端,无法收到该频道之前的消息,因为Redis不会对发布的消息进行持久化。
和许多专业的消息队列相比(例如Kafka、RocketMQ)相比,Redis的发布-订阅略显粗糙,例如无法实现消息堆积和回溯。
3.取消订阅
命令格式如下:
unsubscribe channel [channel ...]
客户端可以通过unsubscribe 命令取消对指定频道的订阅,取消成功后不会再收到该频道的发布消息:
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、查看订阅频道数
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");