Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Abonnieren Sie mehrere Kanäle mit demselben Thread Jedis

Ich habe das gleiche Problem beobachtet, nämlich dass der abonnierende Thread blockiert, sobald Sie ihn abonniert haben. Um dies zu beheben, habe ich einen optimierten Pub/Sub-Client mit Netty implementiert und ihn hier in einen Jedis-Fork integriert. Es ist keine umfassende Lösung und ich hatte keine Zeit, es wirklich fertigzustellen, aber es funktioniert für einfache Kanal- und Musterabonnements. Die Grundlagen sind:

Erwerben Sie eine Pubsub-Instanz mit:

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

Musterabonnements ausstellen/kündigen mit:

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

Sie können das zurückgegebene ChannelFuture ignorieren, es sei denn, Sie möchten 100 % sicher sein, dass Ihre Anfrage durchkommt (es ist asynchron).

Kanalabonnements ausstellen/kündigen mit:

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

Implementieren Sie dann SubListener-Instanzen:

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);
}

und die Listener registrieren/abmelden mit:

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

OptimizedPubSub blockiert niemals und Ereignisse werden asynchron an die registrierten SubListener geliefert.

Der Fork ist jetzt etwas alt, daher ist er in seiner aktuellen Form möglicherweise nicht nützlich für Sie, aber Sie können den Quellcode einfach in dieses Paket ziehen und ihn eigenständig erstellen. Die Abhängigkeiten sind Jedis und Netty.

Tut mir leid, dass ich keine umfassendere Lösung hatte.