使用 StackExchange.Redis 实现 Redis Keyspace 通知

20
我正在寻找如何在使用StackExchange.Redis库时对keyspace通知进行订阅。查看了可用的测试,发现使用通道进行pubsub,但这更像是工作方式类似于服务总线/排队,而不是订阅特定的Redis键事件。请问是否可以利用StackExchange.Redis实现此Redis功能?
2个回答

24

常规订阅者API应该可以正常工作,没有用例的假设,这应该可以正常工作。

不过,我也认为这是内置功能,可能会受益于API上的助手方法,以及一个不同的委托签名——封装键空间通知的语法,使人们不需要重复它。为此:建议您记录一个问题,以免被遗忘。

如何订阅keyspace事件的简单示例

首先,重要的是要检查Redis键空间事件是否已启用。例如,Set类型的键应启用事件。这可以使用CONFIG SET命令完成:

CONFIG SET notify-keyspace-events KEs

启用keyspace事件后,只需订阅发布-订阅频道即可:

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 事件的信息。


2

仅仅是扩展所选答案已经描述的内容:

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),以便获取基于通道的到期通知更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接