StackExchange.Redis中的到期回调

时间:2015-03-05 11:51:35

标签: c# callback redis stackexchange.redis

StackExchange.Redis是否有能力在缓存项目过期后执行回调? 与Microsoft.Practices.EnterpriseLibrary.Caching中的ICacheItemRefreshAction类似

    [Serializable]
    private class CacheEventHandler : ICacheItemRefreshAction
    {
        public void Refresh(string key, object expiredValue, CacheItemRemovedReason removalReason)
        {
            // Item has been removed from cache. Perform desired actions here, based upon
            // the removal reason (e.g. refresh the cache with the item).
            ResetStaticData();
        }
    }

1 个答案:

答案 0 :(得分:2)

这是不可能的(或者它可能非常不可靠),因为当密钥到期时, Redis 对其内置键空间事件有一些限制({} {3}}):

  

过期事件的时间

     

具有生存时间关联的密钥由Redis以两种方式过期:

     
      
  • 当命令访问密钥并且发现它已过期时。
  •   
  • 通过后台系统在后台逐步查找过期的密钥,以便能够收集从不的密钥   访问。
  •   

因此,你想要的根本不可靠。如果您想在某个缓存密钥过期后重新引入数据但 Redis 告诉您所谓的密钥已经过期这么晚会发生什么?

另一方面, Redis 键空间通知使用常规 pubsub 通道实现, Redis pubsub通过射后不理的。如果 Redis 想要通知它时,监听密钥到期的过程无效,会发生什么?

我建议您使用任务计划程序更好地解决问题,而不是依赖于 Redis

何时依赖内置过期系统

即使您不能依赖关于密钥到期的通知,我也会说内置的到期系统非常强大。

示例用例可能是您需要向用户公开一组数据,并且这些用户每小时访问该数据集的次数很多。

也就是说,您将所谓的数据集添加到 Redis ,并且您将过期时间设置为2小时,并且由于整个数据不会发生太大变化,因此您的用户不会在 Redis 中缓存数据时访问主数据。

数据过期后,直到没有大量用户访问数据, Redis 没有缓存。

expire命令有很多用例,但我再说,根据缓存过期实时采取行动并不好。

如果你想要走这条路线......

...很久以前检查Q& A I openen,你会找到一个关于如何订阅keypace pubsub频道的示例代码: