Heim >Datenbank >Redis >So implementieren Sie mit der Redis-Publish-and-Subscribe-Methode ein einfaches Nachrichtensystem

So implementieren Sie mit der Redis-Publish-and-Subscribe-Methode ein einfaches Nachrichtensystem

WBOY
WBOYnach vorne
2023-05-26 20:52:311354Durchsuche

I. Grundlegende Verwendung

1. Konfiguration

Wir verwenden SpringBoot 2.2.1.RELEASE, um die Projektumgebung direkt zu erstellen pom.xml hinzufügen2.2.1.RELEASE来搭建项目环境,直接在pom.xml中添加 redis 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

如果我们的 redis 是默认配置,则可以不额外添加任何配置;也可以直接在application.yml配置中,如下

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password:

2. 使用姿势

redis 的发布/订阅,主要就是利用两个命令publish/subscribe; 在 SpringBoot 中使用发布订阅模式比较简单,借助 RedisTemplate 可以很方便的实现

a. 消息发布

@Service
public class PubSubBean {
    @Autowired
    private StringRedisTemplate redisTemplate;

    public void publish(String key, String value) {
        redisTemplate.execute(new RedisCallback<Object>() {
            @Override
            public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {
                redisConnection.publish(key.getBytes(), value.getBytes());
                return null;
            }
        });
    }
}

b. 订阅消息

消息订阅这里,需要注意我们借助org.springframework.data.redis.connection.MessageListener来实现消费逻辑

public void subscribe(MessageListener messageListener, String key) {
    redisTemplate.execute(new RedisCallback<Object>() {
        @Override
        public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {
            redisConnection.subscribe(messageListener, key.getBytes());
            return null;
        }
    });
}

c. 测试 case

写一个简单的测试 case,来验证一下上面的发布订阅,顺带理解一下这个MessageListener

@RestController
@RequestMapping(path = "rest")
public class DemoRest {
    @Autowired
    private PubSubBean pubSubBean;

    // 发布消息
    @GetMapping(path = "pub")
    public String pubTest(String key, String value) {
        pubSubBean.publish(key, value);
        return "over";
    }

    // 新增消费者
    @GetMapping(path = "sub")
    public String subscribe(String key, String uuid) {
        pubSubBean.subscribe(new MessageListener() {
            @Override
            public void onMessage(Message message, byte[] bytes) {
                System.out.println(uuid + " ==> msg:" + message);
            }
        }, key);
        return "over";
    }
}

Wenn unser Redis die Standardkonfiguration ist, müssen Sie keine zusätzliche Konfiguration hinzufügen; Sie können es auch direkt in application.yml code> Konfiguration, wie folgt

notify-keyspace-events Ex

2. Verwenden Sie Haltung

redis Publish/Subscribe, hauptsächlich mit zwei Befehlen publish/subscribe; Es ist relativ einfach, den Publish-Subscribe-Modus in SpringBoot zu verwenden. Er kann mit Hilfe von RedisTemplate

subscribe __keyevent@0__:expired
implementiert werden

b. Abonnementnachricht

Nachrichtenabonnement hier, bitte beachten Sie, dass wir org.springframework.data.redis.connection.MessageListener verwenden, um die Verbrauchslogik zu implementieren

rrreee

c. Testfall

Schreiben Sie einen einfachen Testfall, um das obige Veröffentlichen und Abonnieren zu überprüfen und die Nutzungssituation dieses MessageListener zu verstehen Projektieren und zwei weitere Schnittstellen bereitstellen#🎜 🎜#rrreee

Wir erstellen zuerst zwei Verbraucher, und dann werden beim Senden einer Nachricht beide empfangen; dann wird ein neuer Verbraucher hinzugefügt, und beim Senden einer Nachricht werden alle drei empfangen#🎜 🎜##🎜 🎜#3. Gebrauchsanweisungen und Anwendungsszenarien
  • Redis' Publish and Subscribe ist nur für relativ einfache Anwendungsszenarien geeignet Veröffentlichungs- und Abonnementmodell, das 1 bis N unterstützt, und die gesendete Nachricht kann nur von Online-Verbrauchern abgerufen werden (was für diejenigen, die nicht online sind, nur als schade bezeichnet werden kann), und für Redis ist es nach der Nachricht vorbei wird verdrängt. Ob Verbraucher Normalkonsum können, ist egal

    Kernpunkt:
  • Nur Online-Verbraucher können das erhalten Nachricht
  • #🎜 🎜#

Verbraucher können eine Nachricht nur einmal erhalten

Die nächste Frage lautet, unter welchen Umständen dies möglich ist Was ist mit dem Veröffentlichen und Abonnieren mit Redis?

Speicherbasierte Cache-Ungültigmachung

Die Verwendung von Reids + Speicher für sekundären Cache kann mit Hilfe von als relativ üblich angesehen werden Speicherbasierter Cache Der Cache kann die Systemlast effektiv erhöhen, aber das Problem ist auch, dass zwischengespeicherte Daten im Speicher ungültig werden, insbesondere wenn eine Anwendung auf mehreren Servern bereitgestellt wird Für alle Server gleichzeitig ist die Verwendung von Redis Publish/Subscribe eine bessere Wahl In einem Konfigurationscenter kann dieses Problem häufig auftreten. Die dynamische Aktualisierung nach einer Konfigurationsänderung ist ein Problem (natürlich besteht die offizielle Unterstützung darin, die Synchronisierung über den Bus über mq durchzuführen, und Sie können die Aktualisierung auch über den Spring-Boot-Administrator erzwingen)

# 🎜🎜#Mit Redis veröffentlichen/abonnieren, die Implementierung einer dynamischen Aktualisierung der Konfiguration ist ebenfalls eine gute Alternative (eine spezifische Implementierungsdemo wird später gegeben, wenn Sie interessiert sind, folgen Sie bitte weiterhin dem Yihuihui-Blog)

# 🎜🎜#Redis-Schlüssel abgelaufenes Abonnement# 🎜🎜#

Wenn wir Redis zum Caching verwenden, stellen wir normalerweise eine Ablaufzeit ein, die natürlich nicht standardmäßig aktiviert ist Abonnieren Sie auch die Cache-Ungültigmachung über das Abonnementereignis

Ändern Sie die Konfiguration und aktivieren Sie das Schlüsselfehlerereignisrrreee

Nach dem Neustart von Redis abonnieren Sie das Fehlerereignis

rrreee

Das obige ist der detaillierte Inhalt vonSo implementieren Sie mit der Redis-Publish-and-Subscribe-Methode ein einfaches Nachrichtensystem. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen