Condivisione della tecnologia

Implementazione di code di messaggi utilizzando Redis: pratica di List, Pub/Sub e Stream

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Riepilogo

Redis è un sistema di archiviazione chiave-valore ad alte prestazioni e le sue molteplici strutture di dati lo rendono la scelta ideale per implementare le code di messaggi. Questo articolo esplorerà come utilizzare le strutture dati List, Pub/Sub e Stream di Redis per implementare un efficiente sistema di code di messaggi.

1. Concetti base di coda di messaggi

Una coda di messaggi è un meccanismo per la comunicazione tra applicazioni che consente alle applicazioni di inviare e ricevere messaggi in modo asincrono. Viene utilizzato nei sistemi distribuiti per disaccoppiare i componenti del servizio e migliorare la scalabilità e l'affidabilità del sistema.

2. Vantaggi di Redis come coda di messaggi

  • alte prestazioni: Redis è un'operazione basata sulla memoria con velocità di lettura e scrittura estremamente elevate.
  • Varie strutture dati: Supporta varie strutture dati come List, Set, Pub/Sub, ecc., adatte a diversi scenari di utilizzo.
  • Persistenza: supporta la persistenza dei dati e garantisce che i messaggi non vadano persi.
  • Operazioni atomiche: supporta transazioni e operazioni atomiche per garantire la coerenza delle operazioni sulla coda dei messaggi.

3. Utilizzare Elenco per implementare la coda di messaggi

L'elenco è una delle strutture dati di base in Redis e può essere utilizzato come una semplice coda di messaggi.

3.1 Operazioni di base

  • produttore:utilizzoLPUSHIl comando inserisce il messaggio in testa alla Lista.
  • consumatore:utilizzoBRPOPIl comando blocca il messaggio dalla fine dell'elenco.

3.2 Esempio di implementazione

// 生产者
jedis.lpush("queue", "message");

// 消费者
String message = jedis.brpop(0, "queue");
  • 1
  • 2
  • 3
  • 4
  • 5

4. Utilizzare Pub/Sub per implementare il modello di pubblicazione/sottoscrizione

Pub/Sub è un modello di pubblicazione e sottoscrizione di messaggi che consente il recapito di messaggi uno-a-molti.

4.1 Operazioni di base

  • annunciatore:utilizzoPUBLISHIl comando pubblica messaggi sul canale specificato.
  • abbonato:utilizzoSUBSCRIBEComando per iscriversi al canale e ricevere messaggi.

4.2 Esempio di implementazione

// 发布者
jedis.publish("channel", "message");

// 订阅者
jedis.subscribe(new JedisPubSub() {
    @Override
    public void onMessage(String channel, String message) {
        System.out.println("Received: " + message);
    }
}, "channel");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5. Utilizzare Stream per implementare la coda di messaggi

Stream è una nuova struttura dati persistente introdotta in Redis 5.0, appositamente progettata per le code di messaggi e le funzioni di registrazione.

5.1 Operazioni di base

  • produttore:utilizzoXADDIl comando aggiunge un messaggio allo stream.
  • consumatore:utilizzoXREADIl comando legge i messaggi da Stream.

5.2 Esempio di implementazione

// 生产者
String messageId = jedis.xadd("stream", StreamEntry.entry("field1", "value1"));

// 消费者
List<Map.Entry<String, String>> messages = jedis.xread(StreamsXReadParams.STREAMS.entry("stream", messageId));
  • 1
  • 2
  • 3
  • 4
  • 5

5.3 Utilizzare lo script Lua e Redis Stream per implementare una coda di messaggi efficiente

1. Vantaggi degli script Lua in Redis
  • atomicita: Gli script Lua vengono eseguiti all'interno di Redis, garantendo l'atomicità delle operazioni.
  • prestazione: riduce il numero di round trip di rete e migliora l'efficienza di esecuzione.
  • flessibilità: Può scrivere logica complessa per adattarsi alle diverse esigenze aziendali.
2. Utilizzare lo script Lua per utilizzare Redis Stream
2.1 Operazioni di base
  • produttore:utilizzoXADDIl comando aggiunge un messaggio allo stream.
  • consumatore:utilizzoXREADIl comando legge i messaggi da Stream.
  • gruppo di consumatori:utilizzoXREADGROUPIl comando implementa la funzione del gruppo di consumatori.
2.2 Esempio di script Lua

Quello che segue è un semplice esempio di script Lua per implementare le operazioni di base di produttori e consumatori.

-- 生产者脚本
local function produce(streamKey, message)
    local result = redis.call('XADD', streamKey, '*', 'message', message)
    return result
end

-- 消费者脚本
local function consume(streamKey, groupName, consumerName)
    local result = redis.call('XREADGROUP', 'GROUP', groupName, consumerName, 'BLOCK', 5000, 'STREAMS', streamKey, 0)
    return result
end

-- 调用脚本
local streamKey = 'myStream'
local message = 'Hello, Redis Stream!'
local groupName = 'myGroup'
local consumerName = 'myConsumer'

-- 生产消息
local messageId = produce(streamKey, message)

-- 消费消息
local messages = consume(streamKey, groupName, consumerName)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

3. Utilizzo di gruppi di consumatori

I gruppi di consumatori sono una funzionalità di Redis Stream che consente a più istanze di consumatori di coordinare il proprio lavoro e consumare congiuntamente messaggi nello Stream.

3.1 Creare un gruppo di consumatori
redis.call('XGROUP', 'CREATE', streamKey, groupName, '$', 'MKSTREAM')
  • 1
3.2 Lettura delle associazioni dei consumatori
redis.call('XREADGROUP', 'GROUP', groupName, consumerName, 'BLOCK', 5000, 'STREAMS', streamKey, '>')
  • 1

4. Riepilogo

Utilizzando gli script Lua e Redis Stream per implementare le code di messaggi è possibile sfruttare appieno le elevate prestazioni di Redis e l'atomicità degli script Lua per creare un sistema di code di messaggi efficiente e affidabile. La funzionalità dei gruppi di consumatori migliora ulteriormente la disponibilità e la scalabilità delle code di messaggi.

5. Precauzioni
  • Assicurati che gli script Lua siano completamente testati prima dell'esecuzione.
  • Considerando la persistenza e la sicurezza del messaggio, configurare opportunamente la strategia di persistenza Redis.
  • In un ambiente di produzione, monitorare le prestazioni e lo stato delle code di messaggi per garantire un funzionamento stabile del sistema.
6. Riferimenti

6. Riepilogo

Redis offre diversi modi per implementare le code di messaggi, ognuno dei quali ha i propri scenari applicabili. List è adatto per requisiti di coda semplici, Pub/Sub è adatto per la modalità di pubblicazione/sottoscrizione e Stream fornisce funzioni di coda dei messaggi più potenti, tra cui persistenza, gruppi di consumatori e altre funzionalità.
Inserisci qui la descrizione dell'immagine

7. Riferimenti