Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Inscreva-se em vários canais com o mesmo tópico Jedis


Eu observei o mesmo problema, ou seja, que o segmento de assinatura é bloqueado quando você se inscreve. Para resolver isso, implementei um cliente pub/sub otimizado usando Netty e o incorporei em um fork Jedis aqui. Não é uma solução abrangente e não tive tempo de realmente terminá-la, mas funciona para assinaturas básicas de canal e padrão. O básico é:

Adquira uma instância pubsub usando:
public static OptimizedPubSub getInstance(String host, int port, String auth, long timeout)

Emitir/cancelar assinaturas padrão usando:
public ChannelFuture psubscribe(String... patterns)
public ChannelFuture punsubscribe(String... patterns)

você pode ignorar o ChannelFuture retornado, a menos que queira ter 100% de certeza de que sua solicitação será concluída (é assíncrona).

Emitir/cancelar assinaturas de canais usando:
public ChannelFuture subscribe(String... channels)
public ChannelFuture unsubscribe(String... channels)

Em seguida, implemente instâncias 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);
}

e registre/desregistre os ouvintes usando:
public void registerListener(SubListener listener)
public void unregisterListener(SubListener listener)

O OptimizedPubSub nunca bloqueia e os eventos são entregues aos SubListeners registrados de forma assíncrona.

O fork é um pouco antigo agora, então pode não ser útil para você em sua forma atual, mas você pode facilmente extrair o código-fonte desse pacote e construí-lo de forma independente. As dependências são Jedis e Netty.

Desculpe, eu não tinha uma solução mais abrangente.