日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

023_Jedis的发布和订阅

發布時間:2025/4/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 023_Jedis的发布和订阅 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.?Redis為我們提供了publish/subscribe(發布/訂閱)功能。我們可以對某個channel(頻道)進行subscribe(訂閱),當有人在這個channel上publish(發布)消息時, Redis就會通知我們, 這樣我們可以收到別人發布的消息。

2. 作為Java的Redis客戶端, Jedis提供了publish/subscribe的接口。本文講述如何使用Jedis來實現Redis的publish/subscribe。

3. Jedis定義了抽象類JedisPubSub, 在這個類中, 定義publish/subsribe的回調方法。通過繼承JedisPubSub類并重新實現這些回調方法, 當publish/subsribe事件發生時, 我們可以定制自己的處理邏輯。

4. 新建一個名為JedisPubSub的Java項目, 拷入相關jar包, 并添加到build path

5. 自定義發布和訂閱的回調類

package com.redis.publish;import redis.clients.jedis.JedisPubSub;/*** 發布和訂閱的回調類*/ public class MyJedisPubSub extends JedisPubSub {private String clientName;public MyJedisPubSub(String clientName) {this.clientName = clientName;}@Overridepublic void onMessage(String channel, String message) {System.out.println(String.format("%s客戶端, 訂閱%s頻道, 接受到的消息是: %s", clientName, channel, message));}@Overridepublic void onSubscribe(String channel, int subscribedChannels) {System.out.println(String.format("%s客戶端, 訂閱%s頻道, 一共訂閱%d個頻道", clientName, channel, subscribedChannels));}@Overridepublic void unsubscribe(String... channels) {super.unsubscribe(channels); // 這個一定要有, 不然取消訂閱不生效for (String item : channels) {System.out.println(String.format("%s客戶端, 取消訂閱%s頻道", clientName, item));}}@Overridepublic void onUnsubscribe(String channel, int subscribedChannels) {System.out.println(String.format("%s客戶端, 取消訂閱%s頻道, 還訂閱%d個頻道", clientName, channel, subscribedChannels));}}

6. Jedis的subscribe操作

6.1.?Jedis的subscribe的聲明如下

public void subscribe(final JedisPubSub jedisPubSub, final String… channels)

6.2. 第一個參數接受一個JedisPubSub對象, 第二個參數指定對哪個頻道進行訂閱。上例中, 我們把我們自定義的MyJedisPubSub對象傳給subscribe方法。當publish/subscribe的事件發生時, 會自動調用我們MyJedisPubSub的方法。

6.3. 由于Jedis的subscribe操作是阻塞的, 因此, 我們另起一個線程來進行subscribe操作。

7. 自定義訂閱和取消訂閱類

package com.redis.publish;import redis.clients.jedis.Jedis;/*** 訂閱和取消訂閱線程類*/ public class SubscribeThread extends Thread {private Jedis jedis;private MyJedisPubSub myJedisPubSub;private String[] channels;public SubscribeThread(String clientName, String[] channels) {this.jedis = new Jedis("192.168.25.138", 6379);this.jedis.auth("lyw123456");this.myJedisPubSub = new MyJedisPubSub(clientName);this.channels = channels;}@Overridepublic void run() {jedis.subscribe(myJedisPubSub, channels);}public void unsubscribe(String[] channels) {myJedisPubSub.unsubscribe(channels);}}

8. 發布類

package com.redis.publish;import redis.clients.jedis.Jedis;/*** 發布類, 同時啟動2個訂閱客戶端*/ public class RedisPublish {public static void main(String[] args) {String cctv = "cctv";String ximalaya = "xi ma la ya";Jedis jedis = new Jedis("192.168.25.138", 6379);jedis.auth("lyw123456");SubscribeThread lisi = new SubscribeThread("lisi", new String[] {cctv});lisi.start();SubscribeThread zhangsan = new SubscribeThread("zhangsan", new String[] {cctv, ximalaya});zhangsan.start();try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}jedis.publish(cctv, "小冠快走");jedis.publish(ximalaya, "貞觀長歌");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}zhangsan.unsubscribe(new String[] {cctv, ximalaya});jedis.publish(cctv, "新年快樂");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}lisi.unsubscribe(new String[] {cctv});jedis.close();} }

9. 運行結果

總結

以上是生活随笔為你收集整理的023_Jedis的发布和订阅的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。