在 C# 驱动程序中订阅 Redis 过期事件?

bor*_*o2g 4 c# redis

如果您向要添加到 Redis 的实体添加过期时间,例如在 ServiceStack.Redis 中:

redisClient.Set(elementKey, "some cached value", DateTime.Now.AddMinutes(2));
Run Code Online (Sandbox Code Playgroud)

那么您如何订阅该元素的到期时间。期望的结果是:

redisClient.Subscribe(elementKey, "expire", DoSomethingBasedOnKey)
Run Code Online (Sandbox Code Playgroud)

Ofi*_*fir 6

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

Redis 有 Keyspace 通知,您可以在此处阅读,

Keyspace 通知允许客户端订阅 Pub/Sub 通道,以便接收以某种方式影响 Redis 数据集的事件。

活动类型

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

发布keyspace@0 :mykey del
发布keyevent@0 :del mykey

因此,您需要订阅将在 keyevent 过期命令上发布消息的频道(达到 ttl 时也有效),其前缀如下所示:“ keyevent@0 :expired”

在我的例子中,计时精度并不重要,因此我使用 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:

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

通知键空间事件 Ex

或者像这样动态(实例重新启动时配置可能会丢失)

配置集notify-keyspace-events Ex