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

Posted

技术标签:

【中文标题】使用 StackExchange.Redis 的 Redis 键空间通知【英文标题】:Redis keyspace notifications with StackExchange.Redis 【发布时间】:2014-06-04 12:51:49 【问题描述】:

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

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

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

【问题讨论】:

启动蝙蝠信号...我的意思是,Marc Gravell 信号(因此是“MGS”)。 @SimonWhitehead 哈哈哈哈哈哈 (伸手将MGS关闭) 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

常规订阅者 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。

【讨论】:

顺便说一句,为了使用订阅者 API 模拟键空间通知,解决方案是什么?每当我们对某些 Redis DB 进行一些更改时,是否 Publish/PublishAsync @Matias 不,如果启用了键空间通知,服务器会这样做。您需要做的就是订阅。 啊啊啊啊我明白了。 Keyspace 通知只是一个通道。我错了吗? 好的,正如您所说,也许 StackExchange.Redis 可以实现帮助程序以避免不太优雅的键空间通道名称约定。类似Keyspace.Subscribe("users:messages:*", RedisKeyEvent.SAdd) 有没有办法使用 .net API 启用事件,或者我必须使用控制台 CONFIG SET notify-keyspace-events KEs 来启用事件?

以上是关于使用 StackExchange.Redis 的 Redis 键空间通知的主要内容,如果未能解决你的问题,请参考以下文章

StackExchange.Redis中文使用文档

StackExchange.Redis 基本使用 (转)

stackExchange.redis的使用

如何使用 StackExchange.Redis 将 Redis Key 插入为整数

扩展 StackExchange.Redis 支持实体

Jexus~mono中使用StackExchange.redis的问题