我想在ASP.NET缓存中放置一个项目,例如数据集,而不是让它过期,直到我的应用程序中发生需要刷新项目的事件。但在此之前,它永远不会过期。
所以a)是否可以设置一个永不过期的缓存项目(除了设置过期,比如将来1年),以及b)如何手动强制项目过期?
谢谢!
答案 0 :(得分:1)
是否可以设置一个永不过期的缓存项目(除了设置到期时说明将来1年)
排序 - Insert
方法有一个支持这种情况的重载:(reference)
DataSet myDataSet = getDataSet();
Page.Cache.Insert("MyDataSetCacheKey", myDataSet)
这会将对象添加到缓存中,没有滑动到期且没有绝对到期,但它使用默认优先级,而不是NotRemovable
。如果你想强迫它,你必须自己为Insert
编写一个扩展方法。
如何手动强制项目过期?
我假设你的意思是'我已经永远缓存了这些数据,但现在我想改变它'。在这种情况下,您不会使它过期,您只需将其从缓存中删除:
Page.Cache.Remove("MyDataSetCacheKey")
逻辑上,从缓存中删除的项目之间没有区别,因为它已过期,被服务器刷新,试图清除内存或者手动删除它。
答案 1 :(得分:1)
我认为这对你有用。然后,当您准备刷新项目时,手动将其从缓存中删除并再次设置...
Page.Cache.Add("object",
"something",
null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
System.Web.Caching.Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable,
new CacheItemRemovedCallback((s, o, r) =>
{
// some callback code if you want...
}));
更新(更好的演示):
private int _counter = 0;
protected void Page_Load(object sender, EventArgs e)
{
// You can add the cache key like this
AddToCache("key", () => "some object " + _counter++);
//Any time you want to refresh the value, you can call RefreshCachedValue
RefreshCachedValue("key");
RefreshCachedValue("key");
RefreshCachedValue("key");
RefreshCachedValue("key");
RefreshCachedValue("key");
// In this demo, the cached value is now "some object 5"
}
private void AddToCache(string key, Func<object> getValueFunction)
{
Page.Cache.Add(key,
getValueFunction(),
null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
System.Web.Caching.Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable,
new CacheItemRemovedCallback((s, o, r) =>
{
AddToCache(s, getValueFunction);
}));
}
private void RefreshCachedValue(string key)
{
Page.Cache.Remove(key);
}
答案 2 :(得分:0)
有一些CacheDependency,你可以使用FileBased CacheDependency引用一个空文件。
如果您的数据发生变化,只需覆盖该文件即可。文件更改后,缓存将立即重置。