sql >> Base de Datos >  >> NoSQL >> Redis

Suscríbete a múltiples canales con el mismo hilo Jedis

Observé el mismo problema, a saber, que el hilo de suscripción se bloquea una vez que te suscribes. Para abordar esto, implementé un cliente pub/sub optimizado usando Netty y lo incorporé en una bifurcación de Jedis aquí. No es una solución completa y no he tenido tiempo de terminarla realmente, pero funciona para suscripciones básicas de canales y patrones. Los conceptos básicos son:

Adquiera una instancia de pubsub usando:

public static OptimizedPubSub getInstance(String host, int port, String auth, long timeout)

Emitir/Cancelar suscripciones de patrones usando:

public ChannelFuture psubscribe(String... patterns)
public ChannelFuture punsubscribe(String... patterns)

puede ignorar el ChannelFuture devuelto a menos que desee asegurarse al 100 % de que su solicitud se realice (es asíncrona).

Emitir/Cancelar suscripciones de canales usando:

public ChannelFuture subscribe(String... channels)
public ChannelFuture unsubscribe(String... channels)

Luego implemente instancias de SubListener:

public interface SubListener {
    /**
     * Callback when a message is published on a subscribed channel
     * @param channel The channel the message was received on
     * @param message The received message
     */
    public void onChannelMessage(String channel, String message);

    /**
     * Callback when a message is published on a subscribed channel matching a subscribed pattern
     * @param pattern The pattern that the channel matched
     * @param channel The channel the message was received on
     * @param message The received message
     */
    public void onPatternMessage(String pattern, String channel, String message);
}

y registre/anule el registro de los oyentes usando:

public void registerListener(SubListener listener)
public void unregisterListener(SubListener listener)

OptimizedPubSub nunca bloquea y los eventos se entregan a los SubListeners registrados de forma asíncrona.

La bifurcación es un poco antigua ahora, por lo que puede que no le sea útil en su forma actual, pero puede extraer fácilmente la fuente en ese paquete y construirlo de forma independiente. Las dependencias son Jedis y Netty.

Lo siento, no tenía una solución más completa.