如何检查MemoryCache中的项目何时过期?

15

在MemoryCache中,是否可以读取一个项的过期时间?

我正在使用.NET的System.Runtime.Caching.MemoryCache将我的配置信息存储30分钟,然后从数据库重新加载。作为状态页面的一部分,我想显示特定缓存项的年龄或到期时间。

object config = LoadSomeStuffFromDatabase();
CacheItemPolicy cachePolicy = new CacheItemPolicy() { AbsoluteExpiration = DateTime.Now.AddMinutes(30) }; 
Cache.Add("MyConfigKey", config, cachePolicy);

// And now I want to do something like this :-)
DateTime dt = Cache.SomeMagicMethod("MyConfigKey");

今天我正在使用一个每次重新加载配置时都会更新的变量。但是,从缓存本身读取此信息会更好。


3
一种替代方案是在存储对象时同时缓存插入日期,这样当您以后检索该对象时,您将知道您何时保存了它,并可以计算出它将过期需要多长时间。 - Matias Cicero
2个回答

10

我相信这个问题已经得到了回答:

如何获取缓存项的过期日期?

如果这不是你想要的,请考虑以下内容:

API不支持从检索缓存项中获取策略。由于您可以缓存任何对象,因此您可以将策略与对象一起缓存,并在以后访问对象时进行一些基于时间的比较。


链接的答案与SlidingExpiration有关。但是你和@Matias-Cicero的设计建议比分别维护它更好。我已经有了基本对象,所以它很好地满足了我的要求。 - Mattias Lindberg
4
在我看来,这是一个非常糟糕的API。将策略作为一级条目缓存,而不是针对缓存项的元数据,这种做法非常糟糕。 - matao

0
缓存提供了实现你想要的功能所需的工具,你只需要完成程序员的工作:
object config = LoadSomeStuffFromDatabase();

DateTime expirationDate = DateTime.Now.AddMinutes(30);
CacheItemPolicy cachePolicy = new CacheItemPolicy() { AbsoluteExpiration = expirationDate }; 

Cache.Add("MyConfigKey", config, cachePolicy);
Cache.Add("MyConfigKey/ExpirationDate", expirationDate, cachePolicy);

// Now do something like this
DateTime dt = Cache.Get("MyConfigKey/ExpirationDate");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接