Compartir tecnología

Implementación de colas de mensajes usando Redis: práctica de List, Pub/Sub y Stream

2024-07-12

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


Resumen

Redis es un sistema de almacenamiento de valores clave de alto rendimiento y sus múltiples estructuras de datos lo convierten en una opción ideal para implementar colas de mensajes. Este artículo explorará cómo utilizar las estructuras de datos List, Pub/Sub y Stream de Redis para implementar un sistema de cola de mensajes eficiente.

1. Conceptos básicos de cola de mensajes.

Una cola de mensajes es un mecanismo de comunicación entre aplicaciones que permite a las aplicaciones enviar y recibir mensajes de forma asincrónica. Se utiliza en sistemas distribuidos para desacoplar componentes de servicio y mejorar la escalabilidad y confiabilidad del sistema.

2. Ventajas de Redis como cola de mensajes

  • alto rendimiento: Redis es una operación basada en memoria con velocidades de lectura y escritura extremadamente rápidas.
  • Varias estructuras de datos: Admite varias estructuras de datos, como Lista, Conjunto, Pub/Sub, etc., adecuadas para diferentes escenarios de uso.
  • Persistencia: Admite la persistencia de datos y garantiza que los mensajes no se pierdan.
  • Operaciones atómicas: Admite transacciones y operaciones atómicas para garantizar la coherencia de las operaciones de la cola de mensajes.

3. Utilice Lista para implementar la cola de mensajes

La lista es una de las estructuras de datos básicas en Redis y puede usarse como una cola de mensajes simple.

3.1 Operaciones básicas

  • productor:usarLPUSHEl comando inserta el mensaje en el encabezado de la Lista.
  • consumidor:usarBRPOPEl comando bloquea el mensaje del final de la Lista.

3.2 Ejemplo de implementación

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

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

4. Utilice Pub/Sub para implementar el modelo de publicación/suscripción.

Pub/Sub es un modelo de suscripción y publicación de mensajes que puede lograr la entrega de mensajes de uno a varios.

4.1 Operaciones básicas

  • locutor:usarPUBLISHEl comando publica mensajes en el canal especificado.
  • abonado:usarSUBSCRIBEComando para suscribirse al canal y recibir mensajes.

4.2 Ejemplo de implementación

// 发布者
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. Utilice Stream para implementar la cola de mensajes

Stream es una nueva estructura de datos persistentes introducida en Redis 5.0, especialmente diseñada para colas de mensajes y funciones de registro.

5.1 Operaciones básicas

  • productor:usarXADDEl comando agrega un mensaje a la secuencia.
  • consumidor:usarXREADEl comando lee mensajes de Stream.

5.2 Ejemplo de implementación

// 生产者
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 Utilice el script Lua y Redis Stream para implementar una cola de mensajes eficiente

1. Ventajas de los scripts Lua en Redis
  • atomicidad: Los scripts de Lua se ejecutan dentro de Redis, lo que garantiza la atomicidad de las operaciones.
  • actuación: Reduce el número de viajes de ida y vuelta de la red y mejora la eficiencia de ejecución.
  • flexibilidad: Puede escribir lógica compleja para adaptarse a diferentes necesidades comerciales.
2. Utilice el script Lua para operar Redis Stream
2.1 Operaciones básicas
  • productor:usarXADDEl comando agrega un mensaje a la secuencia.
  • consumidor:usarXREADEl comando lee mensajes de Stream.
  • grupo de consumidores:usarXREADGROUPEl comando implementa la función de grupo de consumidores.
2.2 Ejemplo de script Lua

El siguiente es un ejemplo simple de script Lua para implementar operaciones básicas de productores y consumidores.

-- 生产者脚本
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. Uso de grupos de consumidores

Los grupos de consumidores son una característica de Redis Stream que permite que múltiples instancias de consumidores coordinen su trabajo y consuman mensajes en Stream de forma conjunta.

3.1 Crear grupo de consumidores
redis.call('XGROUP', 'CREATE', streamKey, groupName, '$', 'MKSTREAM')
  • 1
3.2 Lectura de grupos de consumidores
redis.call('XREADGROUP', 'GROUP', groupName, consumerName, 'BLOCK', 5000, 'STREAMS', streamKey, '>')
  • 1

4. Resumen

El uso de scripts Lua y Redis Stream para implementar colas de mensajes puede aprovechar al máximo el alto rendimiento de Redis y la atomicidad de los scripts Lua para construir un sistema de colas de mensajes eficiente y confiable. La característica de los grupos de consumidores mejora aún más la disponibilidad y escalabilidad de las colas de mensajes.

5. Precauciones
  • Asegúrese de que los scripts de Lua se prueben completamente antes de su ejecución.
  • Teniendo en cuenta la persistencia y seguridad del mensaje, configure la estrategia de persistencia de Redis de forma adecuada.
  • En un entorno de producción, supervise el rendimiento y el estado de las colas de mensajes para garantizar un funcionamiento estable del sistema.
6. Referencias

6. Resumen

Redis proporciona múltiples formas de implementar colas de mensajes, cada una de las cuales tiene sus escenarios aplicables. List es adecuado para requisitos de cola simples, Pub/Sub es adecuado para el modo de publicación/suscripción y Stream proporciona funciones de cola de mensajes más potentes, incluida la persistencia, los grupos de consumidores y otras características.
Insertar descripción de la imagen aquí

7. Referencias