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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM