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)
这是不可能的(或者可能非常不可靠),因为Redis在密钥过期时引发事件时对其内置密钥空间事件有一些限制(在此处了解更多信息):
过期事件的时间安排
Redis 通过两种方式使与生存时间相关的密钥过期:
- 当通过命令访问密钥并发现密钥已过期时。
- 通过后台系统在后台逐步查找过期密钥,以便能够收集从未访问过的密钥。
因此,你想要的根本不可靠。如果你想在某个缓存的 key 过期后重新引入数据,但是Redis这么晚告诉你所谓的 key 已经过期了,会发生什么情况呢?
另一方面,Redis键空间通知是使用常规pubsub通道实现的,并且Redis pubsub 是通过即发即弃的概念实现的。如果Redis想要通知它时监听密钥过期的进程不起作用,会发生什么情况?
我建议您使用任务调度程序可以更好地解决问题,而不是依赖Redis。
即使您不能依赖有关密钥过期的通知,我也会说内置过期系统非常强大。
示例用例可能是您需要向用户公开一组数据,并且这些用户每小时多次访问该数据集。
也就是说,你将所谓的数据集添加到Redis中,并设置2小时的过期时间,并且由于整个数据变化不大,因此在数据缓存期间,你的用户将无法访问主数据在Redis中。
数据过期后,直到没有大量用户访问该数据时,Redis才对其进行缓存。
该命令有很多用例expire,但我再说一遍,根据缓存过期实时采取操作并不好。
...查看我很久以前打开的一个问答,您将在其中找到有关如何订阅 keyspace pubsub 频道的示例代码:
| 归档时间: |
|
| 查看次数: |
5654 次 |
| 最近记录: |