zoukankan      html  css  js  c++  java
  • Redis发布订阅(Pub-Sub)模式

    一、redis做消息队列

    1. redis存储的list数据是双向链表实现的,可以作为队列

    2. 使用lpush和rpop实现入队和出队

    3. 每次使用lpush和rpop都要发起一次连接,性能不好

    4. 这是一次生产,一次消费的队列

    二、发布/订阅模式(publish/subscribe),也是作为消息队列

    1. 可以一次生产,多次消费

    2. 发布:PUBLISH channel message

    jedis.publish(CHANNEL_KEY, message);

    3. 消费:SUBSCRIBE channel

            //消息处理,接收到消息时如何处理
            JedisPubSub jps = new JedisPubSub() {
                /**
                 * JedisPubSub类是一个没有抽象方法的抽象类,里面方法都是一些空实现
                 * 所以可以选择需要的方法覆盖,这儿使用的是SUBSCRIBE指令,所以覆盖了onMessage
                 * 如果使用PSUBSCRIBE指令,则覆盖onPMessage方法
                 * 当然也可以选择BinaryJedisPubSub,同样是抽象类,但方法参数为byte[]
                 */
                @Override
                public void onMessage(String channel, String message) {
                    if(Publisher.CHANNEL_KEY.equals(channel)) {
                        System.out.println("接收到消息: channel : " + message);
                        //接收到exit消息后退出
                        if(EXIT_COMMAND.equals(message)) {
                            System.exit(0);
                        }
     
                    }
                }
     
                /**
                 * 订阅时
                 */
                @Override
                public void onSubscribe(String channel, int subscribedChannels) {
                    if(Publisher.CHANNEL_KEY.equals(channel)) {
                        System.out.println("订阅了频道:" + channel);
                    }
                }
            };
            //可以订阅多个频道 当前线程会阻塞在这儿
            jedis.subscribe(jps, channel);

    二、特点

    1. 客户端在订阅了消息之后,可以继续订阅,取消订阅,PING,QUIT结束连接

    2. 发布的消息在Redis上不存储,因此必须先订阅,再发布

    3. 订阅的通道名称支持glob模式匹配

    三、API

    1. SUBSCRIBE执行订阅

    2. PSUBSCRIBE执行glob模式订阅

    3. UNSUBSCRIBE取消订阅

    4. PUNSUBSCRIBE取消glob模式订阅

    5. PUBLISH发布消息

    6. PUBSUB执行状态查询

    参考:

    https://blog.csdn.net/azurelaker/article/details/85045183

    https://blog.csdn.net/u011489043/article/details/78780255

    https://www.cnblogs.com/qlqwjy/p/9763754.html

    https://www.cnblogs.com/shamo89/p/9873368.html

  • 相关阅读:
    bzoj 3727: Final Zadanie 思维题
    bzoj 2510: 弱题 概率期望dp+循环矩阵
    bzoj 1131: [POI2008]Sta DFS
    bzoj 3572: [Hnoi2014]世界树 虚树
    bzoj 3611: [Heoi2014]大工程 虚树
    bzoj 3545: [ONTAK2010]Peaks Kruskal重构树
    bzoj 2118: 墨墨的等式 spfa
    bzoj 1441: Min 裴蜀定理
    bzoj 4540: [Hnoi2016]序列 莫队
    bzoj 4034: 树上操作 线段树
  • 原文地址:https://www.cnblogs.com/june0816/p/11073041.html
Copyright © 2011-2022 走看看