使用StackExchange.Redis的Redis键空间通知

时间:2014-04-20 09:51:51

标签: c# .net redis publish-subscribe stackexchange.redis

我一直在环顾四周,而且我无法使用StackExchange.Redis库找到如何在Redis上订阅密钥空间通知。

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

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

2 个答案:

答案 0 :(得分:19)

常规订阅者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
            }
        }
    );
}

详细了解密钥空间事件here

答案 1 :(得分:0)

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

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(配置设置notify-keyspace-events KEx )以获取基于频道的到期通知更新。