• Redis 发布和订阅


    一、概述


    1). 发布和订阅是一种消息通信模式。

    2). 优点:使消息订阅者和消息发布者耦合度降低,类似设计模式中的观察者模式。

    二、发布和订阅


    订阅命令: 

    // 订阅一个或多个频道
    // 返回值:value_1 为 “subcribe” 表示订阅成功,value_2 为订阅的频道名称,value_3 表示当前订阅的频道个数
    subscribe  channel1  channel2  channel3 ...
    // 模式订阅
    // 返回值:value_1 为 “psubcribe” 表示订阅成功,value_2 为订模式订阅的 pattern,value_3 表示当前订阅的频道个数
    psubscribe abc*  xyz*  ...

    发布命令:

    // 发布命令
    publish channel msg

    启动订阅者 X 和订阅者 Y,分别发出订阅命令,如下面两张图片:

     

    启动发布者,发布如下消息:

    订阅者 X 和订阅者 Y 都收到了订阅消息:

    取消订阅(取消订阅在官方给的客户端上是无法模拟的)

    UNSUBSCRIBE  cctv-1
    PUNSUBSCRIBE  cctv-*

    查看订阅

    // 查看订阅的所有频道
    pubsub  channels;
    pubsub  channels  msg*;
    // 查看该频道的订阅人数
    pubsub  numsub  channel1 channel2 ... ;

       

    三、编程展示 Redis 的发布和订阅


    编程展示:

    public class MySub extends JedisPubSub{
    
        @Override
        public void onMessage(String channel, String msg) {
            System.out.println("onMessage - " + channel +" - " +msg);
        }
    
        @Override
        public void onPMessage(String pattern, String channel, String msg) {
            System.out.println("onPMessage - " + pattern +" - "+ channel +" - " +msg);
        }
    
        @Override
        public void onPSubscribe(String channel, int msg) {
            System.out.println("onPsubscribe - " + channel +" - "+ msg);
        }
    
        @Override
        public void onPUnsubscribe(String arg0, int arg1) {}
    
        @Override
        public void onSubscribe(String channel, int number) {
            System.out.println("onSubscribe - " + channel +" - "+ number);
            
        }
    
        @Override
        public void onUnsubscribe(String arg0, int arg1) {}
    }

    订阅者 A

    public class SubClient {
        public static void main(String[] args) {
            MySub sub = new MySub();
            Jedis jedis = new Jedis("127.0.0.1", 6379);
            jedis.subscribe(sub, "cctv-1");
        }
    }

    订阅者 B (模式订阅) 

    public class PsubClient {
        public static void main(String[] args) {
            MySub sub = new MySub();
            Jedis jedis = new Jedis("127.0.0.1", 6379);
            jedis.psubscribe(sub, "cctv*");
        }
    }

    发布者 C

    public class PubClient {
        public static void main(String[] args) {
            Jedis jedis = new Jedis("127.0.0.1", 6379);
            jedis.publish("cctv-1", "hello,this is cctv-1");
        }
    }

    依次运行客户端 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
  • 相关阅读:
    面向对象设计大作业第二阶段:图书馆系统
    OO之接口-DAO模式代码阅读及应用
    OO设计-有理数类的设计
    DS博客作业05--查找
    DS博客作业04--图
    DS博客作业03--树
    DS博客作业02--栈和队列
    DS01——线性表
    c博客06-结构体&文件
    C语言博客作业05——指针
  • 原文地址:https://www.cnblogs.com/felix-1/p/5360171.html
Copyright © 2020-2023  润新知