SpringBoot+Redis 實現訊息訂閱釋出

大雄45發表於2022-02-07
導讀 Redis 通常在專案中用的最多的功能是快取,然而今天為你介紹它的另一個功能,輕量級的訊息佇列。
Redis 釋出訂閱

Redis 提供了釋出訂閱功能,可以用於訊息的傳輸,Redis 的釋出訂閱機制包括三個部分,釋出者,訂閱者和 Channel(稱之為頻道或主題)。

SpringBoot+Redis 實現訊息訂閱釋出SpringBoot+Redis 實現訊息訂閱釋出

釋出者將訊息釋出到指定頻道,訂閱該頻道的訂閱者就能夠接受到這條訊息,如果有多個訂閱者,那麼他們會接受到相同的訊息。

功能實現
釋出訊息

Redis 採用 PUBLISH  傳送訊息,其返回值為接收到該訊息的訂閱者的數量。

SpringBoot+Redis 實現訊息訂閱釋出SpringBoot+Redis 實現訊息訂閱釋出

訂閱頻道

Redis 採用 SUBSCRIBE  訂閱某個頻道,其返回值包括客戶端訂閱的頻道,目前已訂閱的頻道數量,以及接收到的訊息,其中subscribe表示已經成功訂閱了某個頻道。

SpringBoot+Redis 實現訊息訂閱釋出SpringBoot+Redis 實現訊息訂閱釋出

模式匹配

模式匹配功能允許客戶端訂閱符合某個模式的頻道,Redis採用PSUBSCRIBE訂閱符合某個模式所有頻道,用“ * ”表示模式,“ * ”可以被任意值代替。

SpringBoot+Redis 實現訊息訂閱釋出SpringBoot+Redis 實現訊息訂閱釋出

假設客戶端同時訂閱了某種模式和符合該模式的某個頻道,那麼傳送給這個頻道的訊息將被客戶端接收到兩次,只不過這兩條訊息的型別不同,一個是 message 型別,一個是 pmessage 型別,但其內容相同。

取消訂閱

Redi s採用 UNSUBSCRIBE 和 PUNSUBSCRIBE 命令取消訂閱,其返回值與訂閱類似。由於Redis的訂閱操作是阻塞式的,因此一旦客戶端訂閱了某個頻道或模式,就將會一直處於訂閱狀態直到退出。在 SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE 和 PUNSUBSCRIBE 命令中,其返回值都包含了該客戶端當前訂閱的頻道和模式的數量,當這個數量變為0時,該客戶端會自動退出訂閱狀態。

SpringBoot+Redis 實現釋出訂閱

pringboot 如何整合 redis 我這裡就不講了,相信對你來說也沒有一點問題。我們直接上程式碼

訊息監聽配置
@Configuration
public class RedisSubConfig {
    public static final String SUB_KEY = "chat";//頻道channel
    /**
     * redis訊息監聽器容器
     * 可以新增多個監聽不同話題的redis監聽器,只需要把訊息監聽器和相應的訊息訂閱處理器繫結,該訊息監聽器
     * 透過反射技術呼叫訊息訂閱處理器的相關方法進行一些業務處理
     * @param connectionFactory
     * @param listenerAdapter
     * @return
     */
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //訂閱了一個頻道
        container.addMessageListener(listenerAdapter, new PatternTopic(RedisSubConfig.SUB_KEY));
        return container;
    }
    /**
     * 訊息監聽器介面卡,繫結訊息處理器,利用反射技術呼叫訊息處理器的業務方法
     * @param receiver
     * @return
     */
    @Bean
    MessageListenerAdapter listenerAdapter(RedisReceiver receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }
    /**
     * redis 讀取內容的template
     * @param connectionFactory
     * @return
     */
    @Bean
    StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
        return new StringRedisTemplate(connectionFactory);
    }
}
接收訊息
@Service
public class RedisReceiver {
    public void receiveMessage(String message) {
        System.out.println("接收訊息:" + message);
    }
}
採用定時器釋出訊息
@EnableScheduling //開啟定時器功能
@Component
public class MessageSender {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Scheduled(fixedRate = 5000) //間隔5s 透過StringRedisTemplate物件向redis訊息佇列chat頻道釋出訊息
    public void sendMessage(){
        stringRedisTemplate.convertAndSend("chat", "hello "+ new Date());
    }
}

執行結果

SpringBoot+Redis 實現訊息訂閱釋出SpringBoot+Redis 實現訊息訂閱釋出

原文來自:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2854716/,如需轉載,請註明出處,否則將追究法律責任。

相關文章