redis 发布订阅
发布订阅模式中的角色
- 发布者(publisher)
- 订阅者(subscriber)
- 频道(channel)
如图所示:
发布者发布消息到频道,订阅了频道的订阅者可以收到消息,订阅者可以订阅不同的频道。
通信模型
- RedisServer中可以创建若干channel
- 一个订阅者可以订阅多个channel
- 当发布者向一个频道中发布一条消息时,所有的订阅者都将会收到消息
- Redis的发布订阅模型没有消息积压功能,即新加入的订阅者收不到发布者之前发布的消息
- 当订阅者收到消息时,消息内容如下
- 第一行:固定内容message
- 第二行:channel的名称
- 第三行:收到的新消息
发布订阅的 API
命令 | 含义 |
---|---|
publish channel message | 向指定的channel中发布消息 |
subscribe channel1 [channel2...] | 订阅给定的一个或多个渠道的消息 |
unsubcribe [channel1 [channel2...]] | 取消订阅给定的一个或多个渠道的消息 |
psubscribe pattern1 [pattern2...] | 订阅一个或多个符合给定模式的频道 |
punsubscribe [pattern1 [pattern2...]] | 退订所有给定模式的频道 |
pubsub channel | 列出至少有一个订阅者的频道 |
pubsub numsub [channel...] | 列出给定频道的订阅者数量 |
演示
消息队列和发布订阅区别
我们来看一张消息队列通信模型的图:
可以看到:
发布订阅模式是将消息通知每一个订阅者,消息队列是消息发布者发表消息后只有一个消息订阅者收得到,订阅者争抢接受消息,这是一个抢的功能。
发布订阅 - Jedis
//订阅
public void testSubscribe() {
Jedis jedis = new Jedis("127.0.0.1" , 6381);
jedis.subscribe(new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
System.out.println("receive channel ["+channel+"] message ["+message+"]");
}
} , "aliTV" , "googleTV");
}
//发布
public void testPublish() {
Jedis jedis = new Jedis("127.0.0.1" , 6381);
jedis.publish("aliTV" , "I am xxx");
jedis.publish("googleTV" , "My age is 21");
}