oLanJieKou
2017-01-22 09:31
采纳率: 100%
浏览 3.6k
已采纳

C#怎么实现redis 键过期通知

RT 例如我设置task键5秒后过期,在过期后我要捕获到task的key值,也就是redis文档里的keyspace notification 这个问题采用有偿回答 最先回答并且能正常使用的 微信红包50以示敬意。。。 微信号 pretense_rot

我是想用这个来实现一段时间内支付的功能 类似于饿了么那种 过期就自动取消订单了

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • oLanJieKou 2017-02-04 03:57
    已采纳

    根据redis文档 键空间通知》事件的类型
    对于每个修改数据库的操作,键空间通知都会发送两种不同类型的事件。
    比如说,对 0 号数据库的键 mykey 执行 DEL 命令时, 系统将分发两条消息, 相当于执行以下两个 PUBLISH 命令:
    PUBLISH keyspace@0:mykey del PUBLISH keyevent@0:del mykey
    订阅第一个频道 keyspace@0:mykey 可以接收 0 号数据库中所有修改键 mykey 的事件, 而订阅第二个频道 keyevent@0:del 则可以接收 0 号数据库中所有执行 del 命令的键。
    以 keyspace 为前缀的频道被称为键空间通知(key-space notification), 而以 keyevent 为前缀的频道则被称为键事件通知(key-event notification)。
    当 del mykey 命令执行时:
    键空间频道的订阅者将接收到被执行的事件的名字,在这个例子中,就是 del 。
    键事件频道的订阅者将接收到被执行事件的键的名字,在这个例子中,就是 mykey 。
    得知,实际上我们只需要订阅subscribe 完整频道:__keyevent@0__:expired 即可收到键过期通知

    点赞 打赏 评论
  • devmiao 2017-01-22 17:08
    点赞 打赏 评论
  • oLanJieKou 2017-02-04 03:57

    var channelName = "__keyevent@0__:expired";
    using (var redisConsumer = new RedisClient(_redisPath))
    {
    using (var subscription = redisConsumer.CreateSubscription())
    {
    XmlConfigurator.Configure();
    Type type = MethodBase.GetCurrentMethod().DeclaringType;
    var log = LogManager.GetLogger(type);

                    subscription.OnSubscribe = channel => log.Info("Subscribed to " + channel);
                    subscription.OnUnSubscribe = channel => log.Info("UnSubscribed from " + channel);
                    subscription.OnMessage = (channel, msg) =>
                    {
                        if (msg.Contains("preferentialOrder_"))
                        {
                            var preferentialId = msg.Split(new[] { '_' }, StringSplitOptions.RemoveEmptyEntries)[1];
    
                            log.Info(string.Format("Received '{0}' from channel '{1}'", msg, channel));
                        }
                        log.Info(string.Format("Received '{0}' from channel '{1}'", msg, channel));
                    };
                    log.Info(string.Format("Started Listening On '{0}'", channelName));
                    subscription.SubscribeToChannels(channelName);
                }
            }
    
    点赞 打赏 评论

相关推荐 更多相似问题