我正在寻找如何在使用StackExchange.Redis库时对keyspace通知进行订阅。查看了可用的测试,发现使用通道进行pubsub,但这更像是工作方式类似于服务总线/排队,而不是订阅特定的Redis键事件。请问是否可以利用StackExchange.Redis实现此Redis功能?
常规订阅者API应该可以正常工作,没有用例的假设,这应该可以正常工作。
不过,我也认为这是内置功能,可能会受益于API上的助手方法,以及一个不同的委托签名——封装键空间通知的语法,使人们不需要重复它。为此:建议您记录一个问题,以免被遗忘。
首先,重要的是要检查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 事件的信息。
仅仅是扩展所选答案已经描述的内容:
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),以便获取基于通道的到期通知更新。