sql >> Databasteknik >  >> NoSQL >> Redis

Prenumerera på flera kanaler med samma tråd Jedis

Jag observerade samma problem, nämligen att prenumerationstråden blockeras när du prenumererar. För att ta itu med detta implementerade jag en optimerad pub/sub-klient med Netty och införlivade den i en Jedis-gaffel här. Det är inte en heltäckande lösning och jag har inte haft tid att riktigt göra klart det, men det fungerar för grundläggande kanal- och mönsterprenumerationer. Grunderna är:

Skaffa en pubsub-instans med:

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

Utfärda/Avsluta mönsterprenumerationer med:

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

du kan ignorera den returnerade ChannelFuture om du inte vill vara 100 % säker på att din begäran kommer igenom (den är asynkron).

Utfärda/Avsluta kanalprenumerationer med:

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

Implementera sedan SubListener-instanser:

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

och registrera/avregistrera lyssnarna med:

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

OptimizedPubSub blockerar aldrig och händelser levereras till de registrerade SubListeners asynkront.

Gaffeln är lite gammal nu, så den kanske inte är användbar för dig i sin nuvarande form, men du kan enkelt dra källan i det paketet och bygga den fristående. Beroendena är Jedis och Netty.

Ledsen att jag inte hade en mer omfattande lösning.




  1. MongoDB $reverseArray

  2. Mongoose, CastError:Cast to Array misslyckades för värde när man försökte spara en modell som innehåller en modell

  3. Redisson, arbetskö/dequeu. Strategier för bearbetning av meddelande / element vid ofullständig meddelandehantering vid avstängning av system / pod

  4. Hur man konverterar sträng till objectId i LocalField för $lookup Mongodb