Redis keyspace уведомления с StackExchange.Рэдис

я осматриваюсь, и я не могу найти, как выполнить подписку на уведомления keyspace на Redis с помощью StackExchange.Библиотека редиса.

проверка доступных тестов я нашел pubsub с помощью каналов, но это больше работает как служебная шина/очередь, а не подписка на определенные ключевые события Redis.

можно ли воспользоваться этой функцией Redis с помощью StackExchange.Рэдис?

2 ответов


обычный API подписчика должен работать нормально - нет предположения о случаях использования, и это должно работать нормально.

тем не менее, я согласен с тем, что это встроенная функциональность, которая может извлечь выгоду из вспомогательных методов API и, возможно, другой подписи делегата - инкапсулировать синтаксис уведомлений keyapace, чтобы людям не нужно было дублировать его. Для этого: я предлагаю вам зарегистрировать проблему, чтобы она не была забыта.

простой пример подписки на событие keyspace

прежде всего, важно проверить, что события пространства ключей Redis включены. Например, события должны быть включены на ключах типа Set. Это можно сделать с помощью :

CONFIG SET notify-keyspace-events KEs

как только события keyspace включены, это просто подписка на канал pub-sub:

using (ConnectionMultiplexer connection = ConnectionMultiplexer.Connect("localhost"))
{
    IDatabase db = connection.GetDatabase();
    ISubscriber subscriber = connection.GetSubscriber();

    subscriber.Subscribe("__keyspace@0__:*", (channel, value) =>
        {
            if ((string)channel == "__keyspace@0__:users" && (string)value == "sadd")
            {
                // Do stuff if some item is added to a hypothethical "users" set in Redis
            }
        }
    );
}

Узнайте больше о событиях keyspace здесь.


просто расширить то, что выбранный ответ уже описывает:

using (ConnectionMultiplexer connection = ConnectionMultiplexer.Connect("localhost"))
{
    IDatabase db = connection.GetDatabase();
    ISubscriber subscriber = connection.GetSubscriber();

    subscriber.Subscribe($"__keyspace@0__:{channel}", (channel, value) =>
        {
          // Do whatever channel specific handling you need to do here, in my case I used exact Key name that I wanted expiration event for.  
        }
    );
}

еще одна важная вещь, я должен был подписаться на KEx (CONFIG SET notify-keyspace-events KEX по ) чтобы получить обновления на основе канала для уведомлений об истечении срока действия.