订阅c#驱动程序中的Redis过期事件?

订阅c#驱动程序中的Redis过期事件?,c#,redis,C#,Redis,如果将到期日添加到要添加到Redis的实体中,例如在ServiceStack.Redis中: redisClient.Set(elementKey, "some cached value", DateTime.Now.AddMinutes(2)); 然后如何订阅元素的过期。预期的结果将是: redisClient.Subscribe(elementKey, "expire", DoSomethingBasedOnKey) 也许你不知道过期消息不会被完全发布 过期事件的时间安排 与生存时间相关

如果将到期日添加到要添加到Redis的实体中,例如在ServiceStack.Redis中:

redisClient.Set(elementKey, "some cached value", DateTime.Now.AddMinutes(2));
然后如何订阅元素的过期。预期的结果将是:

redisClient.Subscribe(elementKey, "expire", DoSomethingBasedOnKey)

也许你不知道过期消息不会被完全发布

过期事件的时间安排 与生存时间相关联的键是 Redis以两种方式过期:

  • 当通过命令访问密钥并发现密钥已过期时
  • 通过后台系统,在后台以增量方式查找过期密钥,以便能够 收集从未访问过的密钥

我建议您最好使用一些任务调度器,如内置的Windows任务调度器或Quartz.NET来安排任务,以便在密钥必须过期时将消息发布到某个自定义Redis PubSub频道

实际上,您可以订阅过期密钥事件,但正如Matias所说,Redis发布该事件可能需要一些时间

Redis有键空间通知,你可以阅读

键空间通知允许客户端订阅发布/订阅通道,以便接收以某种方式影响Redis数据集的事件

事件类型

键空间通知的实现为影响Redis数据空间的每个操作发送两种不同类型的事件。例如,针对数据库0中名为mykey的密钥的DEL操作将触发两条消息的传递,与以下两个发布命令完全相同:

发布keyspace@0:mykey del
发布keyevent@0:德尔·米基

因此,您需要订阅将在keyevent命令过期时发布消息的频道(在达到ttl时也可以工作),其前缀如下: “keyevent@0:过期“

在我的情况下,计时准确性并不重要,因此我使用ServiceStack C#Redis客户端实现了它:

string EXPIRED_KEYS_CHANNEL = "__keyevent@0__:expired";    
using (IRedisClient client = redisClient.GetClient())
{
    using (var cacheSubscription = client.CreateSubscription())
    {
        cacheSubscription.OnMessage += (ch, expiredKey) =>
        {                            
            FireOnKeyExpired(expiredKey);
        };
        cacheSubscription.SubscribeToChannels(EXPIRED_KEYS_CHANNEL);
    }
}
更新:

确保将redis.conf配置为允许过期密钥上的密钥事件:

通知键空间事件

或者像这样在运行中(当实例重新启动时,配置可能会丢失)


config set notify keyspace events Ex

也许您不知道密钥过期时不会发布过期消息:DOk谢谢。有没有办法监视或捕获密钥何时过期,或者这一概念在Redis中不可能实现?您需要在Redis密钥过期时结合一些时间调度程序来运行任务。您可以在Redis密钥过期的同时安排任务。对不起,我没有太多使用Redis,因此不知道选项或最佳方法。调度程序和任务概念是Redis内置的还是定期轮询系统的外部系统?