Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Berlangganan ke beberapa saluran dengan utas yang sama Jedis

Saya mengamati masalah yang sama, yaitu bahwa utas berlangganan memblokir setelah Anda berlangganan. Untuk mengatasi ini, saya menerapkan klien pub/sub yang dioptimalkan menggunakan Netty dan memasukkannya ke dalam garpu Jedis di sini. Ini bukan solusi yang komprehensif dan saya tidak punya waktu untuk benar-benar menyelesaikannya, tetapi ini berfungsi untuk saluran dasar dan langganan pola. Dasar-dasarnya adalah:

Dapatkan instance pubsub menggunakan:

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

Terbitkan/Batalkan langganan pola menggunakan:

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

Anda dapat mengabaikan ChannelFuture yang dikembalikan kecuali jika Anda ingin memastikan 100% permintaan Anda berhasil (tidak sinkron).

Terbitkan/Batalkan langganan saluran menggunakan:

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

Kemudian implementasikan instance 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);
}

dan daftarkan/batalkan pendaftaran pendengar menggunakan:

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

OptimizedPubSub tidak pernah memblokir dan peristiwa dikirimkan ke SubListeners terdaftar secara asinkron.

Garpu sudah agak tua sekarang, jadi mungkin tidak berguna bagi Anda dalam bentuknya saat ini, tetapi Anda dapat dengan mudah menarik sumber dalam paket itu dan membuatnya berdiri sendiri. Dependensinya adalah Jedis dan Netty.

Maaf saya tidak memiliki solusi yang lebih komprehensif.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Redis — cara terbaik untuk menyimpan peta besar (kamus)

  2. Dapatkan kunci dan nilai Redis di command prompt

  3. Bagaimana cara menyimpan hanya satu database di Redis?

  4. Bagaimana mekanisme berlangganan Redis PubSub bekerja?

  5. Cara Mengatur Yii2 Dengan Konfigurasi Redis