Redis
 sql >> Base de données >  >> NoSQL >> Redis

Abonnez-vous à plusieurs chaînes avec le même fil Jedis

J'ai observé le même problème, à savoir que le fil d'abonnement se bloque une fois que vous vous êtes abonné. Pour résoudre ce problème, j'ai implémenté un client pub/sub optimisé à l'aide de Netty et l'ai incorporé dans un fork Jedis ici. Ce n'est pas une solution complète et je n'ai pas eu le temps de vraiment la terminer, mais cela fonctionne pour les abonnements de base aux chaînes et aux modèles. Les bases sont :

Acquérir une instance pubsub en utilisant :

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

Émettre/Annuler les abonnements aux modèles en utilisant :

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

vous pouvez ignorer le ChannelFuture renvoyé à moins que vous ne vouliez vous assurer à 100 % que votre demande passe (c'est asynchrone).

Émettre/Annuler les abonnements aux chaînes en utilisant :

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

Puis implémentez les instances 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);
}

et enregistrer/désenregistrer les auditeurs en utilisant :

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

OptimizedPubSub ne bloque jamais et les événements sont livrés aux SubListeners enregistrés de manière asynchrone.

Le fork est un peu vieux maintenant, donc il ne vous sera peut-être pas utile dans sa forme actuelle, mais vous pouvez facilement extraire la source de ce package et le construire de manière autonome. Les dépendances sont Jedis et Netty.

Désolé, je n'avais pas de solution plus complète.