Redis使用StackExchange进行密钥空间通知,

t98cgbkg  于 2022-10-31  发布在  Redis
关注(0)|答案(2)|浏览(152)

我四处寻找,却找不到如何使用StackExchange.Redis库订阅Redis上的密钥空间通知。
检查可用的测试,我发现pubsub使用通道,但这更像是一个服务总线/队列,而不是订阅特定的Redis关键事件。

使用StackExchange.Redis是否可以充分利用Redis的这一特性?

dwthyt8l

dwthyt8l1#

常规订阅者API应该工作正常--没有对用例的假设,这应该工作正常。
然而,我同意这是一个内置的功能,它可能会受益于API上的helper方法,并且可能会受益于一个不同的委托签名-封装keyapace通知的语法,这样人们就不需要复制它。我建议你记录一个问题,这样它就不会被遗忘。

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

首先,检查Redis keyspace事件是否被启用是很重要的。例如,事件应该在类型为 Set 的键上启用。这可以通过CONFIG 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
            }
        }
    );
}

了解有关键空间事件here的更多信息。

w7t8yxp5

w7t8yxp52#

为了扩展所选答案已经描述的内容:

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-eventsKEx)来获取基于通道的过期通知更新。

相关问题