Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。
Redis 客户端可以订阅任意数量的频道。
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
发送者
发送者直接通过jedis的publish方法,发布消息。
订阅者
订阅者通过jedis.subscribe()和jedis.psubscribe()实现对发送消息的订阅。两者都需要传入一个JedisPubSub的实现类。区别是subscribe需要传入具体的监听通道名称,而psubscribe是可以传入模糊的通道正则,对所有匹配的通道进行监听。
redisMsgListener类如下
package org.aj.flink.redis;
import redis.clients.jedis.JedisPubSub;
public class RedisMsgListener extends JedisPubSub {
public void unsubscribe() {
super.unsubscribe();
}
public void unsubscribe(String... channels) {
super.unsubscribe(channels);
}
public void subscribe(String... channels) {
super.subscribe(channels);
}
public void psubscribe(String... patterns) {
super.psubscribe(patterns);
}
public void punsubscribe() {
super.punsubscribe();
}
public void punsubscribe(String... patterns) {
super.punsubscribe(patterns);
}
public void onMessage(String channel, String message) {
System.out.println("111111");
// logger.info("onMessage: channel[{}], message[{}]",channel, message);
}
public void onPMessage(String pattern, String channel, String message) {
System.out.println("222222");
// logger.info("onPMessage: pattern[{}], channel[{}], message[{}]", pattern, channel, message);
}
public void onSubscribe(String channel, int subscribedChannels) {
System.out.println("3333333");
// logger.info("onSubscribe: channel[{}], subscribedChannels[{}]", channel, subscribedChannels);
}
public void onPUnsubscribe(String pattern, int subscribedChannels) {
System.out.println("4444444");
// logger.info("onPUnsubscribe: pattern[{}], subscribedChannels[{}]", pattern, subscribedChannels);
}
public void onPSubscribe(String pattern, int subscribedChannels) {
System.out.println("5555555");
// logger.info("onPSubscribe: pattern[{}], subscribedChannels[{}]", pattern, subscribedChannels);
}
public void onUnsubscribe(String channel, int subscribedChannels) {
System.out.println("66666666");
// logger.info("channel:{} is been subscribed:{}", channel, subscribedChannels);
}
}
并且如果使用subscribe()进行监听的话,会触发onMessage()回调
如果使用psubscribe()进行监听的话,会触发onPMessage()回调