如果您向要添加到 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)
实际上你可以订阅过期密钥事件,但正如 Matias 所说,Redis 可能需要一些时间才能发布该事件。
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