【发布时间】:2012-09-19 18:11:05
【问题描述】:
我正在尝试在 .net 4.5 中使用 MemoryCache 来跟踪并自动更新各种项目,但似乎无论我设置为 AbsoluteExpiration 什么,它都只会在 15 秒内过期或更多。
我希望缓存项每 5 秒过期一次,但它总是在至少 15 秒后过期,如果我将过期时间移出,它最终会是 15 秒 + 我的刷新间隔,但绝不会更少超过 15 秒。
是否有一些我没有看到的内部计时器分辨率?我查看了一些反映的 System.Runtime.Caching.MemoryCache 代码,但没有发现任何问题,而且我无法在互联网上找到其他有此问题的人。
我在下面有一个非常基本的例子来说明这个问题。
我想要CacheEntryUpdate 每 5 秒左右被点击一次并更新新数据,但正如我所说,它只会在 15 秒以上被点击。
static MemoryCache MemCache;
static int RefreshInterval = 5000;
protected void Page_Load(object sender, EventArgs e)
{
if (MemCache == null)
MemCache = new MemoryCache("MemCache");
if (!MemCache.Contains("cacheItem"))
{
var cacheObj = new object();
var policy = new CacheItemPolicy
{
UpdateCallback = new CacheEntryUpdateCallback(CacheEntryUpdate),
AbsoluteExpiration = DateTimeOffset.UtcNow.AddMilliseconds(RefreshInterval)
};
var cacheItem = new CacheItem("cacheItem", cacheObj);
MemCache.Set("cacheItem", cacheItem, policy);
}
}
private void CacheEntryUpdate(CacheEntryUpdateArguments args)
{
var cacheItem = MemCache.GetCacheItem(args.Key);
var cacheObj = cacheItem.Value;
cacheItem.Value = cacheObj;
args.UpdatedCacheItem = cacheItem;
var policy = new CacheItemPolicy
{
UpdateCallback = new CacheEntryUpdateCallback(CacheEntryUpdate),
AbsoluteExpiration = DateTimeOffset.UtcNow.AddMilliseconds(RefreshInterval)
};
args.UpdatedCacheItemPolicy = policy;
}
【问题讨论】:
-
为什么要在这么短的时间内缓存对象?如果要在 5-15 秒内驱逐对象,那么使用缓存似乎没有多大价值。
-
我发现了更奇怪的行为:如果你在 CacheItemPolicy 上设置 RemovedCallback,延迟会减少到 10 秒
-
更新我之前的评论:并非总是 10 秒,- 有时是 0,有时是 20。但通常正好是 10 秒
标签: c# .net memorycache