Как заставить Redis уведомлять мой сервис о событиях - PullRequest
1 голос
/ 20 марта 2020

У меня есть удаленный компьютер с Redis. Время от времени к нему добавляются новые записи (пара ключ-значение). Я хочу, чтобы Redis отправлял уведомления на мой C# Сервис о подобных событиях (меня интересует ценностная часть). Я искал в Интернете и нашел простой пример кода для подписки моего сервиса на Redis. Как заставить Redis отправлять уведомления?

Сервис:

public partial class ResultsService : ServiceBase
{
    private ConnectionMultiplexer connection = ConnectionMultiplexer.Connect(ConfigurationManager.AppSettings["RedisConnection"]);

    private const string ChatChannel = "__keyspace@0__:*";

    public VerificationResultsService()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        Start();
    }

    public void Start()
    {
        var pubsub = connection.GetSubscriber();

        pubsub.Subscribe(ChatChannel, (channel, message) => MessageAction(message));

        while (true)
        {

        }
    }

    private static void MessageAction(RedisValue message)
    {
         // some handler...
    }
}

1 Ответ

1 голос
/ 20 марта 2020

Отправка redis automati c keyspace уведомлений - это конфигурация сервера redis, которую можно включить через файл .conf (notify-keyspace-events) или через CONFIG SET во время выполнения; документация для этого здесь .

Вы можете увидеть, как это работает, с примером кода:

using StackExchange.Redis;
using System;
using System.Linq;

static class P
{
    private const string ChatChannel = "__keyspace@0__:*";
    static void Main()
    {
        // connect (allowAdmin just lets me use ConfigSet)
        using var muxer = ConnectionMultiplexer.Connect("127.0.0.1,allowAdmin=true");

        // turn on all notifications; note that this is server-wide
        // and is NOT just specific to our connection/code
        muxer.GetServer(muxer.GetEndPoints().Single())
             .ConfigSet("notify-keyspace-events", "KEA"); // KEA=everything

        // subscribe to the event
        muxer.GetSubscriber().Subscribe(ChatChannel,
            (channel, message) => Console.WriteLine($"received {message} on {channel}"));

        // stop the client from exiting
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }
}

, который работает как:

enter image description here


Однако во многих сценариях ios вы можете обнаружить, что это слишком «шумно», и вы можете предпочесть использовать либо событие с произвольным именем, которое вы публикуете sh вручную когда вы делаете то, что требует уведомления, или (снова вручную) вы можете использовать функции streams для потребления потока данных (потоки можно рассматривать как поток событий в смысле «вещи, которые произошли», но они не доставляются через pub / sub).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...