欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談java實(shí)現(xiàn)redis的發(fā)布訂閱(簡(jiǎn)單易懂)

 更新時(shí)間:2018年03月02日 08:57:33   作者:半城楓葉半城雨丶  
本篇文章主要介紹了淺談java實(shí)現(xiàn) redis的發(fā)布訂閱(簡(jiǎn)單易懂),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

redis的應(yīng)用場(chǎng)景實(shí)在太多了,現(xiàn)在介紹一下它的幾大特性之一   發(fā)布訂閱(pub/sub)。

特性介紹:

什么是redis的發(fā)布訂閱(pub/sub)?   Pub/Sub功能(means Publish, Subscribe)即發(fā)布及訂閱功能?;谑录南到y(tǒng)中,Pub/Sub是目前廣泛使用的通信模型,它采用事件作為基本的通信機(jī)制,提供大規(guī)模系統(tǒng)所要求的松散耦合的交互模式:訂閱者(如客戶端)以事件訂閱的方式表達(dá)出它有興趣接收的一個(gè)事件或一類事件;發(fā)布者(如服務(wù)器)可將訂閱者感興趣的事件隨時(shí)通知相關(guān)訂閱者。熟悉設(shè)計(jì)模式的朋友應(yīng)該了解這與23種設(shè)計(jì)模式中的觀察者模式極為相似。

同樣,Redis的pub/sub是一種消息通信模式,主要的目的是解除消息發(fā)布者和消息訂閱者之間的耦合,  Redis作為一個(gè)pub/sub的server, 在訂閱者和發(fā)布者之間起到了消息路由的功能。

如果沒聽懂上述的專業(yè)解釋,沒關(guān)系,其實(shí)我也沒太聽懂。

簡(jiǎn)單來(lái)講,這里面還有個(gè)channel的概念,這里就是頻道的意思,比如你訂閱了銀行的頻道,當(dāng)你的資金發(fā)生變動(dòng)時(shí),你就會(huì)接受到銀行就會(huì)通過(guò)它的頻道給你發(fā)送信息,在這里,你是屬于被動(dòng)接收的,而不是向銀行索要信息,這個(gè)例子中,你就是sub(訂閱者),而銀行就是pub(發(fā)布者)。

項(xiàng)目運(yùn)用場(chǎng)景:

一直都認(rèn)為你會(huì)一樣技術(shù)之前,都必須先明白這樣一種技術(shù)在哪些地方會(huì)被用到,不能盲目的學(xué)東西。

看到發(fā)布訂閱的特性,用來(lái)做一個(gè)簡(jiǎn)單的實(shí)時(shí)聊天系統(tǒng)再適合不過(guò)了。這是其中之一,當(dāng)然這樣的東西,我們開發(fā)中很少涉及到。再舉一個(gè)常用的,在我們的分布式架構(gòu)中,常常會(huì)遇到讀寫分離的場(chǎng)景,在寫入的過(guò)程中,就可以使用redis發(fā)布訂閱,使得寫入值及時(shí)發(fā)布到各個(gè)讀的程序中,就保證數(shù)據(jù)的完整一致性。再比如,在一個(gè)博客網(wǎng)站中,有100個(gè)粉絲訂閱了你,當(dāng)你發(fā)布新文章,就可以推送消息給粉絲們拉??傊畧?chǎng)景很多,需要去挖掘。。

回顧java如何操作redis:

redis是一種緩存數(shù)據(jù)庫(kù),它也是C/S的結(jié)構(gòu),也就是客戶端和服務(wù)端,一般來(lái)說(shuō),在java中,我們通常使用 jedis(客戶端)去操作redis(服務(wù)端),這其中操作的時(shí)候,兩者之間肯定要建立連接,就像數(shù)據(jù)庫(kù)鏈接一樣,在關(guān)系型數(shù)據(jù)庫(kù)中,我們一般都維護(hù)一個(gè)連接池,以達(dá)到鏈接的復(fù)用,來(lái)省去建立連接和關(guān)閉連接的時(shí)間。所以在jedis中,同樣也存在一個(gè)jedispool(jedis連接池)的概念,我們都是從池中去取連接使用。

上代碼:

想使用jedis先引入依賴

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>

建立一個(gè)Publisher (發(fā)布者)

public class Publisher extends Thread{

  private final JedisPool jedisPool;

  public Publisher(JedisPool jedisPool) {
    this.jedisPool = jedisPool;
  }
  
  @Override
  public void run() {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    Jedis jedis = jedisPool.getResource();  //連接池中取出一個(gè)連接
    while (true) {
      String line = null;
      try {
        line = reader.readLine();
        if (!"quit".equals(line)) {
          jedis.publish("mychannel", line);  //從 mychannel 的頻道上推送消息
        } else {
          break;
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}

再建立一個(gè)訂閱者

public class Subscriber extends JedisPubSub {
  public Subscriber(){}
  @Override
  public void onMessage(String channel, String message) {    //收到消息會(huì)調(diào)用
    System.out.println(String.format("receive redis published message, channel %s, message %s", channel, message));
  }
  @Override
  public void onSubscribe(String channel, int subscribedChannels) {  //訂閱了頻道會(huì)調(diào)用
    System.out.println(String.format("subscribe redis channel success, channel %s, subscribedChannels %d",
        channel, subscribedChannels));
  }
  @Override
  public void onUnsubscribe(String channel, int subscribedChannels) {  //取消訂閱 會(huì)調(diào)用
    System.out.println(String.format("unsubscribe redis channel, channel %s, subscribedChannels %d",
        channel, subscribedChannels));

  }
}

這里訂閱者需要繼承JedisPubSub,來(lái)重寫它的三個(gè)方法。用途 注釋上已經(jīng)寫了,很簡(jiǎn)單。

我們這里只是定義了一個(gè)訂閱者,下面去訂閱頻道。

public class SubThread extends Thread {
  private final JedisPool jedisPool;
  private final Subscriber subscriber = new Subscriber();

  private final String channel = "mychannel";

  public SubThread(JedisPool jedisPool) {
    super("SubThread");
    this.jedisPool = jedisPool;
  }

  @Override
  public void run() {
    System.out.println(String.format("subscribe redis, channel %s, thread will be blocked", channel));
    Jedis jedis = null;
    try {
      jedis = jedisPool.getResource();  //取出一個(gè)連接
      jedis.subscribe(subscriber, channel);  //通過(guò)subscribe 的api去訂閱,入?yún)⑹怯嗛喺吆皖l道名
    } catch (Exception e) {
      System.out.println(String.format("subsrcibe channel error, %s", e));
    } finally {
      if (jedis != null) {
        jedis.close();
      }
    }
  }
}

最后,再寫一個(gè)測(cè)試類去跑一下。鍵盤輸入消息,訂閱者就會(huì)觸發(fā)onMessage方法

public class PubSubDemo {
  public static void main( String[] args )
  {
    // 連接redis服務(wù)端
    JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379);
    
    System.out.println(String.format("redis pool is starting, redis ip %s, redis port %d", "127.0.0.1", 6379));

    SubThread subThread = new SubThread(jedisPool); //訂閱者
    subThread.start();

    Publisher publisher = new Publisher(jedisPool);  //發(fā)布者
    publisher.start();
  }
}

看打印結(jié)果

附上代碼地址  https://github.com/fangyong1421/redis

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot發(fā)送request請(qǐng)求的方式小結(jié)

    springboot發(fā)送request請(qǐng)求的方式小結(jié)

    在Java中,發(fā)送HTTP請(qǐng)求是常見需求,hutool工具包和RestTemplate類是實(shí)現(xiàn)此功能的兩種主流方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • Java+Nginx實(shí)現(xiàn)POP、IMAP、SMTP郵箱代理服務(wù)

    Java+Nginx實(shí)現(xiàn)POP、IMAP、SMTP郵箱代理服務(wù)

    本篇文章的內(nèi)容是介紹Java+Nginx如何實(shí)現(xiàn)POP、IMAP、SMTP郵箱代理服務(wù),步驟詳細(xì),思路清新,需要的朋友可以參考下
    2015-07-07
  • java設(shè)計(jì)模式之橋接模式(Bridge)

    java設(shè)計(jì)模式之橋接模式(Bridge)

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之橋接模式Bridge,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Java注解詳細(xì)介紹

    Java注解詳細(xì)介紹

    這篇文章主要介紹了Java注解詳細(xì)介紹,本文講解了Java注解是什么、Java注解基礎(chǔ)知識(shí)、Java注解類型、定義Java注解類型的注意事項(xiàng)等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • spring mvc中直接注入的HttpServletRequst安全嗎

    spring mvc中直接注入的HttpServletRequst安全嗎

    這篇文章主要給大家介紹了關(guān)于spring mvc中直接注入的HttpServletRequst是不是安全的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2018-04-04
  • java虛擬機(jī)原理:Class字節(jié)碼二進(jìn)制文件分析

    java虛擬機(jī)原理:Class字節(jié)碼二進(jìn)制文件分析

    class文件全名稱為Java class文件,主要在平臺(tái)無(wú)關(guān)性和網(wǎng)絡(luò)移動(dòng)性方面使Java更適合網(wǎng)絡(luò)。它在平臺(tái)無(wú)關(guān)性方面的任務(wù)是:為Java程序提供獨(dú)立于底層主機(jī)平臺(tái)的二進(jìn)制形式的服務(wù)。下面我們來(lái)詳細(xì)解讀下它吧
    2021-09-09
  • Springboot?整合?RocketMQ?收發(fā)消息的配置過(guò)程

    Springboot?整合?RocketMQ?收發(fā)消息的配置過(guò)程

    這篇文章主要介紹了Springboot?整合?RocketMQ?收發(fā)消息,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • java8 stream中Collectors.toMap空指針問(wèn)題及解決

    java8 stream中Collectors.toMap空指針問(wèn)題及解決

    這篇文章主要介紹了java8 stream中Collectors.toMap空指針問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Aop動(dòng)態(tài)代理和cglib實(shí)現(xiàn)代碼詳解

    Aop動(dòng)態(tài)代理和cglib實(shí)現(xiàn)代碼詳解

    這篇文章主要介紹了Aop動(dòng)態(tài)代理和cglib實(shí)現(xiàn)代碼詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java8函數(shù)式接口Predicate用法示例詳解

    Java8函數(shù)式接口Predicate用法示例詳解

    這篇文章主要為大家介紹了Java8函數(shù)式接口Predicate用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評(píng)論