Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Subskrybuj wiele kanałów z tym samym wątkiem Jedis

Zaobserwowałem ten sam problem, a mianowicie, że wątek subskrybujący blokuje się po subskrybowaniu. Aby rozwiązać ten problem, zaimplementowałem zoptymalizowanego klienta pub/sub za pomocą Netty i włączyłem go tutaj do widełek Jedis. Nie jest to kompleksowe rozwiązanie i nie miałem czasu go dokończyć, ale działa w przypadku podstawowych subskrypcji kanałów i wzorców. Podstawy to:

Uzyskaj instancję pubsub za pomocą:

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

Wydaj/anuluj subskrypcje wzorów za pomocą:

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

możesz zignorować zwrócony ChannelFuture, chyba że chcesz mieć 100% pewność, że Twoje żądanie przejdzie (jest asynchroniczne).

Wydaj/anuluj subskrypcje kanałów za pomocą:

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

Następnie zaimplementuj instancje 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);
}

i zarejestruj/wyrejestruj słuchaczy za pomocą:

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

OptimizedPubSub nigdy nie blokuje, a zdarzenia są dostarczane do zarejestrowanych SubListenerów asynchronicznie.

Widelec jest teraz trochę stary, więc może nie być przydatny w obecnej formie, ale możesz łatwo ściągnąć źródła w tym pakiecie i zbudować je samodzielnie. Zależności to Jedis i Netty.

Przepraszamy, nie miałem bardziej kompleksowego rozwiązania.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jakie są przypadki użycia, w których Redis jest lepszy od Aerospike?

  2. RQ — Opróżnij i usuń kolejki

  3. „sesja” jest niezdefiniowana w przypadku używania express / redis do przechowywania sesji

  4. policz liczbę sesji w connect-redis

  5. Ustawienie cache_store w inicjatorze