SpringBoot+Redis 實現消息訂閱發布


什么是 Redis

Redis 是一個開源的使用 ANSI C語言編寫的內存數據庫,它以 key-value 鍵值對的形式存儲數據,高性能,讀取速度快,也提供了持久化存儲機制。

img

Redis 通常在項目中用的最多的功能是緩存,然而今天靚仔將為你介紹它的另一個功能,輕量級的消息隊列。

Redis 發布訂閱

機制

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

img

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

功能實現

發布消息

Redis 采用 PUBLISH 命令發送消息,其返回值為接收到該消息的訂閱者的數量。

img

訂閱頻道

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

img

模式匹配

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

img

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

取消訂閱

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

SpringBoot+Redis 實現發布訂閱

springboot 如何整合 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());
    }
}

運行結果

img

對比RabbitMQ發布訂閱模式

  • Redis:輕量級,低延遲,高並發,低可靠性;
  • RabbitMQ:重量級,高可靠,異步,不保證實時;
  • RabbitMQ是一個專門的 AMQP 協議隊列,他的優勢就在於提供可靠的隊列服務,並且可做到異步,而Redis主要是用於緩存的,Redis 的發布訂閱模式,可用於實現及時性,且可靠性低的功能。

往期推薦

最詳細的圖文解析Java各種鎖(終極篇)

一定要收藏的5個優秀的SpringCloud開源項目

一定要收藏的5個后台管理系統的前端框架

MySQL 三大日志你了解多少?

圖文詳解 23 種設計模式

▼更多精彩推薦,請關注靚仔▼

img


免責聲明!

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



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