手动/立即过期缓存项目

时间:2011-08-22 09:49:49

标签: asp.net caching

我想在ASP.NET缓存中放置一个项目,例如数据集,而不是让它过期,直到我的应用程序中发生需要刷新项目的事件。但在此之前,它永远不会过期。

所以a)是否可以设置一个永不过期的缓存项目(除了设置过期,比如将来1年),以及b)如何手动强制项目过期?

谢谢!

3 个答案:

答案 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引用一个空文件。

如果您的数据发生变化,只需覆盖该文件即可。文件更改后,缓存将立即重置。

http://msdn.microsoft.com/en-us/magazine/cc163955.aspx