Heim  >  Artikel  >  Java  >  Was ist Redis Publish and Subscribe?

Was ist Redis Publish and Subscribe?

PHP中文网
PHP中文网Original
2017-06-20 09:56:161559Durchsuche

Ich dachte darüber nach, das Abonnement-Veröffentlichungsmodell von Redis zu verwenden, um das Push-Problem zu lösen~.

Was die konzeptionelle Beschreibung betrifft, muss ich sie noch mehr oder weniger erwähnen:

什么是Redis发布订阅?Redis发布订阅是一种消息通信模式,发送者通过通道A发送消息message,订阅过通道A的客户端就可以接收到消息message。嗯度娘上面的解释要比我所说的好多了,而我所理解的就是:所谓的订阅发布模式,其实和我们看电视,听广播差不多,在我们没有调台(换频道)的时候,那个频道也是在传递消息的(发布)。我们换到那个频道上(订阅)就能接收到消息了。是的,虽然可能有些不恰当~

Erklärung

本文中示例采用了三个客户端,以“品”字形排列,由上至下,由左至右分别为客户端1(c1),客户端2(c2),客户端3(c3).特此说明。

Redis-Abonnement- und Veröffentlichungsbefehle

Zunächst möchte ich darauf hinweisen, dass Sie in Bezug auf den Aufbau des Redis-Servers bitte selbst die relevanten Informationen prüfen, um die Umgebung aufzubauen

Ich habe gehört, dass es in Redis nur 6 einfache Befehle zum Veröffentlichen und Abonnieren gibt. Das heißt:

  • PSUBSCRIBE-Muster [Muster ...]

  • Abonnieren Sie einen oder mehrere Kanäle, die dem Musterformat

  • Kanalnachricht VERÖFFENTLICHEN

  • Nachricht im Kanal veröffentlichen

  • Unterbefehl PUBSUB [Argument [Argument ...]]

  • Abonnement- und Veröffentlichungssystemstatus anzeigen

  • PUNSUBSCRIBE [Muster [Muster ...]]

  • Alle Kanäle abmelden, die dem Format entsprechen

  • Kanal [Kanal ...] ABONNIEREN

  • Einen oder mehrere Kanäle abonnieren

  • ABONNIEREN [Kanal [Kanal ...]]

  • Vom Kanal abmelden


Beispiel 1 – ABONNIEREN

Nachdem Sie eine Verbindung zu Redis hergestellt haben, geben Sie den Befehl

SUBSCRIBE study
ein, um einen Kanal namens „study“ zu abonnieren.

Der Studienkanal wird als nächstes eine Nachricht senden. ~~


Beispiel 2 – VERÖFFENTLICHEN

Öffnen Sie einen anderen Client. Ich verwende den oberen Teil des Glyphen-Layouts als Herausgeber, geben Sie

PUBLISH study "message1-go go go"
Sie können ein Wenn Kunde 1 eine Nachricht im Studienkanal veröffentlicht, kann Kunde 2 (der den Studienkanal abonniert hat) die von c1 veröffentlichte Nachricht empfangen, aber Kunde 3 kann c1 nicht empfangen, da er den gesendeten Studienkanal nicht abonniert hat.


Beispiel 3 – PSUBSCRIBE

Folgen Sie nun der linken und rechten Hand des Bloggers in Zeitlupe. Geben Sie

PSUBSCRIBE study*
OK in c3 ein, geben Sie nun

PUBLISH study "message2"
in c1 ein. Das obige Ergebnisbild:

c3 übernimmt die Form eines Platzhalters und ändert auch die Studienkanal Das Abonnement war erfolgreich.

Als nächstes geben Sie weiterhin den Befehl in c1 ein:

PUBLISH study:java "I hate java forever"
Sie können sehen, dass mit psubscribe nicht nur der Studienkanal, sondern auch der Kanal mit der Überschrift „Studie“ abonniert wird.


Beispiel 4 – PUBSUB

Geben Sie pubsub-Kanal in c1 ein, um Folgendes zu erhalten:

127.0.0.1:6379> PUBSUB channels

1) "study"
bedeutet den aktuell aktiven Kanal.


Jedis implementiert das Abonnement-Publisher-Modell

好了,上面通过命令行熟悉了一下Redis中有关订阅发布者模式的相关命令。下面我们要将redis的订阅与发布者嵌入到项目中。

首先,我们使用jedis先订阅一个名为:study的频道
Dann veröffentlichen wir zunächst die Nachricht über die Befehlszeile:

Danach verwenden wir Jedis, um dies zu tun im Projekt Nachrichtenveröffentlichung:

Wir können normale Kommunikation haben~Oh ja~


Kerncode:

PublishMessage.java wird verwendet, um einen Thread zum Veröffentlichen zu öffnen Nachrichten

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 wird verwendet, um abonnementbezogene Ereignisse zu verarbeiten, geerbt von 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 zum Abonnieren von Kanälen, Abbrechen von Kanälen und anderen Aktionsklassen

Das obige ist der detaillierte Inhalt vonWas ist Redis Publish and Subscribe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn