我一直在环顾四周,而且我无法使用StackExchange.Redis库找到如何在Redis上订阅密钥空间通知。
检查可用的测试我发现使用频道的pubsub,但这更像是服务总线/排队,而不是订阅特定的Redis密钥事件。
是否可以使用StackExchange.Redis利用此Redis功能?
答案 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 )以获取基于频道的到期通知更新。