- 发布和订阅是一种消息通信模式。
- 优点:使消息订阅者和消息发布者耦合度降低,类似设计模式中的观察者模式。
- Redis 的发布和订阅
发布和订阅
订阅的命令如下:
// 订阅一个或多个频道 subscribe channel1 channel2 channel3 ... // 模式订阅,频道参数类似正则表达式 psubscribe abc* xyz* ...
发布命令如下:
publish channel msg
启动一个订阅者客户端 X
订阅 cctv-1 返回三个参数:subscribe 订阅成功,订阅的频道是 cctv-1,当前订阅的频道个数为 1;
订阅 cctv-2 返回三个参数:subscribe 订阅成功,订阅的频道是 cctv-2,当前订阅的频道个数为 2。
启动一个订阅者客户端 Y
订阅 cctv-* 返回三个参数:psubcribe 订阅成功,订阅的频道 cctv-*,当前客户端订阅的频道数量 1。
启动一个发布者客户端,发布频道 cctv-1 的消息
订阅者客户端 X 收到订阅信息,返回三个参数:收到消息成功,频道,收到的消息
订阅者客户端 Y 收到订阅信息,返回四个参数:收到消息成功,模式订阅频道,收到消息的频道,收到的消息
取消订阅
UNSUBSCRIBE cctv-1 PUNSUBSCRIBE cctv-*
取消订阅在官方给的客户端上是无法模拟的。
查看订阅
// 查看订阅的所有频道 pubsub channels; pubsub channels msg*; // 查看该频道的订阅人数 pubsub numsub channel1 channel2 ... ;
- 编程展示 Redis 的发布和订阅
1 public class MySub extends JedisPubSub{ 2 3 @Override 4 public void onMessage(String channel, String msg) { 5 System.out.println("onMessage - " + channel +" - " +msg); 6 } 7 8 @Override 9 public void onPMessage(String pattern, String channel, String msg) { 10 System.out.println("onPMessage - " + pattern +" - "+ channel +" - " +msg); 11 } 12 13 @Override 14 public void onPSubscribe(String channel, int msg) { 15 System.out.println("onPsubscribe - " + channel +" - "+ msg); 16 } 17 18 @Override 19 public void onPUnsubscribe(String arg0, int arg1) {} 20 21 @Override 22 public void onSubscribe(String channel, int number) { 23 System.out.println("onSubscribe - " + channel +" - "+ number); 24 25 } 26 27 @Override 28 public void onUnsubscribe(String arg0, int arg1) {} 29 }
订阅者客户端 A
1 public class SubClient { 2 public static void main(String[] args) { 3 MySub sub = new MySub(); 4 Jedis jedis = new Jedis("127.0.0.1", 6379); 5 jedis.subscribe(sub, "cctv-1"); 6 } 7 }
订阅者客户端 B (模式订阅)
1 public class PsubClient { 2 public static void main(String[] args) { 3 MySub sub = new MySub(); 4 Jedis jedis = new Jedis("127.0.0.1", 6379); 5 jedis.psubscribe(sub, "cctv*"); 6 } 7 }
发布者客户端 C
1 public class PubClient { 2 public static void main(String[] args) { 3 Jedis jedis = new Jedis("127.0.0.1", 6379); 4 jedis.publish("cctv-1", "hello,this is cctv-1"); 5 } 6 }
依次运行客户端 ABC
A 端输出
onSubscribe - cctv-1 - 1 onMessage - cctv-1 - hello,this is cctv-1
B 端输出
onPsubscribe - cctv* - 1 onPMessage - cctv* - cctv-1 - hello,this is cctv-1
学无止境,多学多记。
时间: 2024-11-07 01:12:24