Redis的订阅与发布
首先要知道四个命令,分别是 **publish、subscribe、unsubscribe、psubscribe **
- publish:发布
- subscribe:订阅
- unsubscribe:取消订阅
- psubscribe:订阅模式
- 订阅模式:其实就是多个“频道”。
- 例如:订阅了[abc]zkw模式,其实就是订阅了azkw、bzkw、czkw,这三个“频道”。
- 订阅可以使多个频道,发送者也就是频道的拥有者,可以发送给指定的频道
如下订阅一个频道
订阅多个频道(模式)
java的订阅与发布
发布
发布消息
public static void publishMsg(String channel,String message){
Jedis jedis = new Jedis("192.168.18.123", 6379);
try {
jedis.publish(channel,message);
} catch (Exception e) {
e.printStackTrace();
} finally {
jedis.close();
}
}
订阅消息
public static JedisPubSub jedisPubSub = new JedisPubSub(){
@Override
public void onMessage(String channel, String message) {
System.out.println("==============================");
System.out.println("收到了:"+channel+"频道发送的消息");
System.out.println("消息:"+message);
}
@Override
public void onSubscribe(String channel, int subscribedChannels) {
System.out.println("订阅了" + channel + "频道");
System.out.println(channel + " : " + subscribedChannels);
}
};
订阅
订阅频道,但是我们在订阅频道的时候可能会出现取消频道的操作,那么怎么处理呢?这就需要用到上边类,这里是一个阻塞队列,所以要用多线程
public static void subscribeMsg(String channels){
Jedis jedis = new Jedis("192.168.18.123", 6379);
new Thread(()->{
try {
jedis.subscribe(jedisPubSub,channels);
} catch (Exception e) {
e.printStackTrace();
} finally {
jedis.close();
}
}).start();
}
测试
public static void main(String[] args) {
//订阅的名字
JedisUtils.subscribeMsg("test");
//发送消息
JedisUtils.publishMsg("test","hello");
JedisUtils.publishMsg("test","world");
}
结果如下