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的发布和订阅的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 022_Jedis的事物
- 下一篇: 010_Redis的发布和订阅