StackExchange.Redis 中的过期回调

oko*_*axa 4 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Mat*_*zer 5

这是不可能的(或者可能非常不可靠),因为Redis在密钥过期时引发事件时对其内置密钥空间事件有一些限制(在此处了解更多信息):

过期事件的时间安排

Redis 通过两种方式使与生存时间相关的密钥过期:

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

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

另一方面,Redis键空间通知是使用常规pubsub通道实现的,并且Redis pubsub 是通过即发即弃的概念实现的。如果Redis想要通知它时监听密钥过期的进程不起作用,会发生什么情况?

我建议您使用任务调度程序可以更好地解决问题,而不是依赖Redis

何时依赖内置过期系统

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

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

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

数据过期后,直到没有大量用户访问该数据时,Redis才对其进行缓存。

该命令有很多用例expire,但我再说一遍,根据缓存过期实时采取操作并不好。

如果你无论如何都想走这条路...

...查看我很久以前打开的一个问答,您将在其中找到有关如何订阅 keyspace pubsub 频道的示例代码: