在ASP.NET 2.0中特定时间清除缓存

7
我有一个进程在午夜运行,为Flash对象设置起始点和结束点。这只需要每天运行一次,所以我显然正在缓存结果集。
但是,我遇到的问题是,如果数据在午夜后仍然被缓存,它不会拉取最正确的数据,直到缓存过期。
基本上,我需要缓存在晚上11:59:59过期,这样在12:00am时可以获取正确的数据。
我猜想在我从中提取数据的表上使用SQL缓存依赖项可能是理想的,但我以前从未设置过。
是否有一种方法可以告诉缓存在准确的午夜删除特定项目?
谢谢大家!
--绝对过期--
我想我搞定了:
DateTime expireWeights = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 59, 999);
Cache.Insert("CacheItemName", itemToCache, null, expireWeights, System.Web.Caching.Cache.NoSlidingExpiration);

+1 有趣的问题。我也很感兴趣得知答案。 - Saar
1
absoluteExpiration是一个DateTime,而不是一个delta。请参见下面的答案。 - RickNZ
不要忘记选择一个答案... - RickNZ
3个回答

5

您可以在Cache对象上设置一个绝对过期时间,它是一个DateTime。

您还可以将absoluteExpiration与SqlCacheDependency结合使用。

关于缓存过期后不拉取新数据的问题:您可以连接一个CacheItemRemovedCallback来接收到期通知,并在那时刷新缓存。


像这样:DateTime expireWeights = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 59, 999); Cache.Insert("CacheItemName", list, null, expireWeights, System.Web.Caching.Cache.NoSlidingExpiration); - Jack Marchetti
1
当然,除了我会使用UtcNow而不是Now,我还会使用一个单一的实例,而不是创建三个不同的实例。 - RickNZ

4

我不明白为什么你对绝对过期时间有疑问?你可以指定项目在缓存中过期的确切日期和时间。因此,下面这行代码将把“myObject”插入到缓存中,键名���“MyKey”,并且会在第二天午夜过期(无论何时它被插入到缓存中)。

Cache.Insert("MyKey", myObject, null, DateTime.Today.AddDays(1), TimeSpan.Zero);

我猜我的困惑在于,如果你正在添加天数,如果它是在下午1点输入的,那么它将在第二天下午1点过期。 - Jack Marchetti
是的,如果你给DateTime.Now加上Days,它会有时间,但如果你给DateTime.Today加上Days,它已经去掉了时间。 - Robin Day
或者使用DateTime.Today.AddSeconds(86399)来获取23:59:59?不确定。从DateTime.UtcNow中提取当前月份、日期和年份似乎更加简洁。虽然最终结果相同。 - RickNZ
另外,如果您需要它在23:59:59.999到期,而不是在第二天午夜,则可以使用System.DateTime.Today.AddDays(1).AddMilliseconds(-1)。我发现这比使用年、月、日、小时、分钟、秒、毫秒构建日期要“更好”。 - Robin Day
还有一个选项...如果需要使用UTC时间,那么您可以始终使用System.DateTime.UtcNow.Date.AddDays(1).AddMilliseconds(-1)。 - Robin Day
很好。这个工作完美无缺。 - Varun Sharma

1
如果你在这里看一下,"基于时间的依赖"下面,它展示了如何设置项目在特定时间过期。这是你要找的吗?

不完全是。基于时间的依赖关系并不是绝对的。我不能告诉它在午夜准确清除,我只能说“在10分钟或2小时后清除”对吧? - Jack Marchetti
1
更好的链接是:http://msdn.microsoft.com/en-us/library/4y13wyk9.aspx -但每次插入项目时,您都需要确定正确的 DateTime,今天的日期,23:59:59 的时间,并确保将 TimeSpan 设置为 Cache.NoSlidingExpiration - Zhaph - Ben Duguid
@JackM:好的,但是如果你知道当前时间,你可以轻松地计算出距离午夜还有多少分钟。此外,Zhaph所说的NoSlidingExpiration也完全正确。 - Steven Sudit

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