20

我环顾四周,找不到如何使用 StackExchange.Redis 库在 Redis 上执行对键空间通知的订阅。

检查可用测试我发现 pubsub 使用通道,但这更像是服务总线/队列,而不是订阅特定的 Redis 键事件。

是否可以使用 StackExchange.Redis 来利用此 Redis 功能?

4

2 回答 2

23

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

但是,我确实同意这是内置功能,它可能会受益于 API 上的辅助方法,也可能受益于不同的委托签名——封装 keyapace 通知的语法,这样人们就不需要复制它。为此:我建议您记录一个问题,以免被遗忘。

如何订阅键空间事件的简单示例

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

CONFIG SET notify-keyspace-events KEs

启用键空间事件后,只需订阅 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
            }
        }
    );
}

在此处了解有关键空间事件的更多信息。

于 2014-04-20T10:35:13.123 回答
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 ) 才能获得基于频道的过期通知更新。

于 2018-10-01T21:31:31.620 回答