玉紹康 關世杰 蘇一博



摘? ?要:隨著科學技術的發展,實時聊天系統、微博以及在一些讀寫分離的分布式架構等應用越來越多,Redis的發布訂閱便可以實現這些功能。針對Redis在分布式系統中作為數據通信中間件的問題,本文主要研究了Redis的發布訂閱功能。首先簡要介紹了Redis的發布訂閱功能和機制,然后在基于Java環境下實現了通過Redis的發布訂閱功能進行客戶機之間的數據通信。
關鍵詞:Redis? 數據通信中間件? 發布訂閱? Java
中圖分類號:TP311? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 文獻標識碼:A? ? ? ? ? ? ? ? ? ? ? ?文章編號:1674-098X(2019)05(b)-0003-02
1? Redis的發布訂閱功能
Redis可以作為數據庫、緩存服務或消息服務使用,其中內存數據庫功能應用最為廣泛[1]。但Redis還有許多功能應用也很廣泛,例如Redis可作為一種數據通信中間件,即發布訂閱功能,應用于實時聊天系統、微博及分布式架構等。
在Redis客戶端鍵入SUBSCRIBE的時候,會建立一個客戶端與一個頻道的訂閱關系,并將所有的頻道和客戶端的訂閱關系都保存在一個叫puhsub_channels的字典中。這個字典的key是某個頻道,而values則是一個鏈表,記錄了所有訂閱這個頻道的客戶端[2]。利用Java實現Redis的發布訂閱功能可以更好地開發需要通信中間件的Java項目。
2? 使用Java實現Redis
Redis是一種緩存數據庫,屬于客戶端和服務端的結構。Java中通常使用 Jedis(客戶端)去操作Redis(服務端),首先兩者之間要建立連接,在Jedis中,采用 Jedis連接池(Jedispool)建立連接,隨時可以從池中取出連接使用[3]。在此基礎上,可設計實現Redis發布訂閱功能過程如圖1所示。
該過程可具體描述如下:
(1)先建立發布者Publisher類,通過頻道(mychannel)發布消息。
(2)由于訂閱操作機制是線程阻塞的,需要另外開啟一個線程(Subscribr類)來專門處理訂閱消息和處理接收消息。
(3)發布者和訂閱者都通過JedisPool中的getResource()方法從Jedis連接池中取出一個連接,連接Redis服務端。
(4)Jedis中的定義JedisPubSub抽象類可以為Redis提供訂閱和取消訂閱的功能。此時需要建立消息監聽類,這個消息監聽類需要繼承JedisPubSub類,并重寫它的三個方法。當收到消息時,會調用onMessage方法;當訂閱頻道時,會調用onSubscribe方法;當取消訂閱時,會調用onUnsubscribe方法。
3? 測試結果
用Java代碼設計通信測試類來啟動訂閱者線程和發布者線程。與此同時訂閱者會調用消息監聽類中onSubscribe方法實現訂閱頻道mychannel,訂閱結束訂閱線程阻塞,并監聽此頻道的消息。訂閱過程如圖2所示,可以看出訂閱頻道成功。
訂閱成功后,用鍵盤輸入要發布的消息,發布者線程中的Publisher接收輸入的消息后,將消息發布到mychannel中,此時訂閱mychannel的訂閱者會收到消息并打印,結果如圖3所示,可以看出發布端成功發布消息,訂閱端已經成功收到消息。
取消訂閱需要輸入quit命令時,即停止發布消息,同時訂閱者調用onUnsubscribe方法取消訂閱,結果如圖4所示,此時取消訂閱成功。
綜上所述,本文設計的在Java環境下基于Redis的發布訂閱功能有效。
4? 結語
Redis技術作為當今應用廣泛的技術之一,在各個領域的應用開發中有著不可替代的作用。本文主要研究了Redis的發布訂閱功能,在基于Java環境中實現了對頻道的訂閱、發布、監聽、接收功能,通過檢測實驗的結果成功訂閱頻道并接收到頻道中發布的消息。本文的研究和測試對分布式系統的通信以及信息交互具有重要的意義 。
參考文獻
[1] 王嫣如.Redis消息推送機制應用技術研究[J].科技廣場,2016(8):41-44.
[2] 黃健宏.Redis設計與實現[M].北京:機械工業出版社,2014.
[3] https://www.cnblogs.com/xinde123/p/8489054.html