RT 例如我设置task键5秒后过期,在过期后我要捕获到task的key值,也就是redis文档里的keyspace notification
我是想用这个来实现一段时间内支付的功能 类似于饿了么那种 过期就自动取消订单了
根据redis文档 键空间通知》事件的类型
对于每个修改数据库的操作,键空间通知都会发送两种不同类型的事件。
比如说,对 0 号数据库的键 mykey 执行 DEL 命令时, 系统将分发两条消息, 相当于执行以下两个 PUBLISH 命令:
订阅第一个频道 __keyspace@0__:mykey 可以接收 0 号数据库中所有修改键 mykey 的事件, 而订阅第二个频道 __keyevent@0__:del 则可以接收 0 号数据库中所有执行 del 命令的键。
以 keyspace 为前缀的频道被称为键空间通知(key-space notification), 而以 keyevent 为前缀的频道则被称为键事件通知(key-event notification)。
当 del mykey 命令执行时:
得知,实际上我们只需要订阅subscribe 完整频道:__keyevent@0__:expired 即可收到键过期通知,redis.net代码如下
1 var channelName = "__keyevent@0__:expired"; 2 using (var redisConsumer = new RedisClient(_redisPath)) 3 { 4 using (var subscription = redisConsumer.CreateSubscription()) 5 { 6 XmlConfigurator.Configure(); 7 Type type = MethodBase.GetCurrentMethod().DeclaringType; 8 var log = LogManager.GetLogger(type); 9 10 subscription.OnSubscribe = channel => log.Info("Subscribed to " + channel); 11 subscription.OnUnSubscribe = channel => log.Info("UnSubscribed from " + channel); 12 subscription.OnMessage = (channel, msg) => 13 { 14 if (msg.Contains("preferentialOrder_")) 15 { 16 var preferentialId = msg.Split(new[] { '_' }, StringSplitOptions.RemoveEmptyEntries)[1]; 17 18 log.Info(string.Format("Received '{0}' from channel '{1}'", msg, channel)); 19 } 20 log.Info(string.Format("Received '{0}' from channel '{1}'", msg, channel)); 21 }; 22 log.Info(string.Format("Started Listening On '{0}'", channelName)); 23 subscription.SubscribeToChannels(channelName); 24 } 25 }