一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Redis 訂閱發布_Jedis實現方法

Redis 訂閱發布_Jedis實現方法

2020-11-20 10:38Java教程網 Java教程

下面小編就為大家帶來一篇Redis 訂閱發布_Jedis實現方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

我想到使用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 ...]]

取消訂閱頻道

例1 - SUBSCRIBE

連接redis后鍵入命令

?
1
SUBSCRIBE study

這樣便訂閱了一個名為study的頻道。

接下來study頻道要發消息啦。~~

例2 - PUBLISH

另開啟一個客戶端,我使用的是品字形布局的最上面那個做為發布者,鍵入

?
1
PUBLISH study "message1-go go go"

可以看到,當客戶端1在study頻道發布消息時,客戶端2(已訂閱study頻道)可以接收到c1發布的消息,而客戶端3由于沒有訂閱study頻道,所以接收不到c1發送的消息。

例3 - PSUBSCRIBE

現在,跟著博主左手,右手一個慢動作。在c3中鍵入

?
1
PSUBSCRIBE study*

OK,現在在c1中鍵入

?
1
PUBLISH study "message2"

上結果圖:

c3采用的通配符的形式,也將study頻道給訂閱成功了。

接下來,在c1中繼續鍵入命令:

?
1
PUBLISH study:java "I hate java forever"

可以看到,使用psubscribe不僅將study頻道訂閱了,而且將以study為首的頻道也訂閱了。

例4 - PUBSUB

在c1中鍵入pubsub channel,可以獲得:

?
1
2
3
127.0.0.1:6379> PUBSUB channels
 
1) "study"

意為當前正在活躍的頻道。

Jedis實現訂閱發布者模式

好了,上面通過命令行熟悉了一下Redis中有關訂閱發布者模式的相關命令。下面我們要將redis的訂閱與發布者嵌入到項目中。

首先,我們使用jedis先訂閱一個名為:study的頻道

然后我們先從命令行處進行消息發布:

之后 ,我們使用jedis在項目中進行消息發布:

我們可以進行正常的通信 ~噢耶~

核心代碼:

PublishMessage.java 用于開啟一個發布消息的線程

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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 訂閱頻道,取消頻道等動作類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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 訂閱發布_Jedis實現方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 女人把扒开给男人爽 | 羞羞一区二区三区四区片 | 日韩日韩日韩手机看片自拍 | 亚洲精品97福利在线 | 九九免费高清在线观看视频 | 含羞草传媒网站免费进入欢迎 | 国产一区二区三区四 | 青柠影院在线观看免费完整版1 | 九九精品视频在线播放 | 99热综合在线 | 无码人妻精品一区二区蜜桃在线看 | 草久久网| 亚洲一级特黄 | 国产手机在线αⅴ片无码观看 | 四虎影院精品在线观看 | 天天爱综合网 | 色哟哟哟| 国产精品嫩草影院在线 | 日本96在线精品视频免费观看 | 99热这里只有精品在线播放 | 国语视频高清在线观看 | 91短视频在线播放 | 亚洲午夜性春猛交xxxx | 国产精品99精品久久免费 | 手机看片福利盒子久久 | 2020年最新国产精品视频免费 | 修修视频在线观看 | japanese人妖xvideos | 亚洲天堂成人在线观看 | 欧美日韩视频一区三区二区 | 按摩院已婚妇女中文字幕 | 成人午夜在线视频 | 天天舔天天操天天干 | a级片在线播放 | 亚洲高清色图 | 5g996未满十八 | 天选之王漫画顾长歌免费阅读 | 韩国一级淫片特黄特刺激 | 亚洲成在人线久久综合 | 欧美国产日本精品一区二区三区 | 91蜜桃|