我想到使用Redis的訂閱發布模式是用來解決推播問題的~。
對於概念性的敘述,多多少少還是要提一下的:
什么是Redis发布订阅?Redis发布订阅是一种消息通信模式,发送者通过通道A发送消息message,订阅过通道A的客户端就可以接收到消息message。嗯度娘上面的解释要比我所说的好多了,而我所理解的就是:所谓的订阅发布模式,其实和我们看电视,听广播差不多,在我们没有调台(换频道)的时候,那个频道也是在传递消息的(发布)。我们换到那个频道上(订阅)就能接收到消息了。是的,虽然可能有些不恰当~
說明
本文中示例采用了三个客户端,以“品”字形排列,由上至下,由左至右分别为客户端1(c1),客户端2(c2),客户端3(c3).特此说明。
Redis訂閱與發布命令
首先聲明,有關Redis伺服器的搭建工作,請自行查閱相關資料進行環境搶建
聽說Redis中發布與訂閱只有簡單的6個命令。即:
PSUBSCRIBE pattern [pattern ...]
訂閱一個或多個符合pattern格式的頻道
#PUBLISH channel message
- ##發佈訊息到chanel中
- PUBSUB subcommand [argument [argument ...]]
- 查看訂閱與發布系統狀態
- PUNSUBSCRIBE [pattern [pattern ...]]
- 取消訂閱所有符合格式的頻道
- SUBSCRIBE channel [channel ...]
- 訂閱一個或多個頻道
- UNSUBSCRIBE [channel [channel ...]]
- #取消訂閱頻道
連接redis後鍵入指令
SUBSCRIBE study
這樣便訂閱了一個名為study的頻道。
接下來study頻道要發訊息啦。 ~~
##範例2 - PUBLISH
另開啟一個客戶端,我使用的是品字形佈局的最上面那個做為發布者,鍵入
PUBLISH study "message1-go go go"可以看到,當客戶端1在study頻道發布消息時,客戶端2(已訂閱study頻道)可以接收到c1發布的消息,而客戶端3由於沒有訂閱study頻道,所以接收不到c1發送的消息。
範例3 - PSUBSCRIBE
現在,跟著部落客左手,右手一個慢動作。在c3中鍵入
PSUBSCRIBE study*OK,現在在c1中鍵入
PUBLISH study "message2"上結果圖:c3採用的通配符的形式,也將study頻道給訂閱成功了。 接下來,在c1中繼續鍵入命令:
PUBLISH study:java "I hate java forever"可以看到,使用psubscribe不僅將study頻道訂閱了,而且將以study為首的頻道也訂閱了。
範例4 - PUBSUB
在c1中鍵入pubsub channel,可以取得:
127.0.0.1:6379> PUBSUB channels 1) "study"意為目前正在活躍的頻道。
Jedis實作訂閱發布者模式
好了,上面通过命令行熟悉了一下Redis中有关订阅发布者模式的相关命令。下面我们要将redis的订阅与发布者嵌入到项目中。 首先,我们使用jedis先订阅一个名为:study的频道
然後我們先從命令列進行訊息發布:之後,我們使用jedis在專案中進行訊息發布:我們可以進行正常的通訊~噢耶~
核心程式碼:
PublishMessage.java 用來開啟一個發佈訊息的執行緒
private Logger logger = LoggerFactory.getLogger(PublishMessage.class); @Resource private JedisCluster jedisCluster; /** * 发布消息 * * @param channel 频道 * @param message 信息 */ public void sendMessage(final String channel, final String message) { Thread thread = new Thread(() -> { Long publish = jedisCluster.publish(channel, message); logger.info("服务器在: {} 频道发布消息{} - {}", channel, message, publish); }); logger.info("发布线程启动:"); thread.setName("publishThread"); thread.start(); }ChatSubscribe.java用來處理訂閱相關事件,繼承自JedisPubSub
private Logger logger = LoggerFactory.getLogger(ChatSubscribe.class); // 取得订阅的消息后的处理 @Override public void onMessage(String channel, String message) { logger.info("订阅成功,接收到的消息为:频道-{},消息-{}", channel, message); RedisString.message = message; } // 取得按表达式的方式订阅的消息后的处理 @Override public void onPMessage(String pattern, String channel, String message) { System.out.println("-----取得按表达式的方式订阅的消息后的处理-----"); System.out.println(pattern + "=" + channel + "=" + message); } // 初始化按表达式的方式订阅时候的处理 @Override public void onPSubscribe(String pattern, int subscribedChannels) { System.out.println("-----初始化按表达式的方式订阅时候的处理-----"); System.out.println(pattern + "=" + subscribedChannels); } // 取消按表达式的方式订阅时候的处理 @Override public void onPUnsubscribe(String pattern, int subscribedChannels) { System.out.println("-----取消按表达式的方式订阅时候的处理-----"); System.out.println(pattern + "=" + subscribedChannels); } @Override public void onPong(String pattern) { super.onPong(pattern); } // 初始化订阅时候的处理 @Override public void onSubscribe(String channel, int subscribedChannels) { logger.info("初始化订阅信息:频道-{},订阅频道-{}", channel, subscribedChannels); } // 取消订阅时候的处理 @Override public void onUnsubscribe(String channel, int subscribedChannels) { logger.info("已取消订阅频道{}", channel); }SubScribeMessage.java 訂閱頻道,取消頻道等動作類別
private Logger logger = LoggerFactory.getLogger(SubScribeMessage.class); private ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); @Resource private JedisCluster jedisCluster; /** * 订阅频道 * * @param channel 频道 * @param roomSubListerner */ public void subscribeChannel(final String channel, final ChatSubscribe roomSubListerner) { cachedThreadPool.execute(new Runnable() { @Override public void run() { jedisCluster.subscribe(roomSubListerner, channel); } }); } jedisCluster是否封装工具类,取自各位看官,核心代码已给出,请各位看官根据自身业务与逻辑,自行更改与优化代码。 本次示例程序采用tomcat 9.0 + spring + springmvc 使用了诸如:@RestController,@GetMapping等相关注解,便于开发,有兴趣可自行查阅spring相关资料。
以上是什麼是Redis發布訂閱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具