首页 新闻 会员 周边

如何用C#实现redis keyspace notifications

0
悬赏园豆:50 [已解决问题] 解决于 2017-02-06 09:23

RT 例如我设置task键5秒后过期,在过期后我要捕获到task的key值,也就是redis文档里的keyspace notification 

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

maxwelltsai的主页 maxwelltsai | 初学一级 | 园豆:111
提问于:2017-02-03 09:40
< >
分享
最佳答案
0

根据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 即可收到键过期通知,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             }

 

 

maxwelltsai | 初学一级 |园豆:111 | 2017-02-04 11:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册