一、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