首页 > 代码库 > .NET4缓存过期策略摘录

.NET4缓存过期策略摘录

以下是网上搜索的资料,仅供参考:

资料一:
ASP.NET缓存中Cache过期的三种策略(转自51CTO)

我们在页面上添加三个按钮并双击按钮创建事件处理方法,三个按钮使用不同的过期策略添加ASP.NET缓存。

  1. <asp:Button ID="btn_InsertNoExpirationCache" runat="server" Text="插入永不过期缓存"   
  2. OnClick="btn_InsertNoExpirationCache_Click" /> 
  3. <asp:Button ID="btn_InsertAbsoluteExpirationCache" runat="server" Text="插入绝对时间  
  4. 过期缓存" OnClick="btn_InsertAbsoluteExpirationCache_Click" /> 
  5. <asp:Button ID="btn_InsertSlidingExpirationCache" runat="server" Text="插入变化时间  
  6. 过期缓存" OnClick="btn_InsertSlidingExpirationCache_Click" /> 

三个按钮的Click事件处理方法如下:

  1. protected void btn_InsertNoExpirationCache_Click(object sender, EventArgs e)  
  2. {  
  3.     DataSet ds = GetData();  
  4.     Cache.Insert("Data", ds);  
  5. }  
  6. protected void btn_InsertAbsoluteExpirationCache_Click(object sender, EventArgs e)  
  7. {  
  8.     DataSet ds = GetData();  
  9.     Cache.Insert("Data", ds,null, DateTime.Now.AddSeconds(10), TimeSpan.Zero);  
  10. }  
  11. protected void btn_InsertSlidingExpirationCache_Click(object sender, EventArgs e)  
  12. {  
  13.     DataSet ds = GetData();  
  14.     Cache.Insert("Data", ds, null, DateTime.MaxValue, TimeSpan.FromSeconds(10));  

我们来分析一下这三种ASP.NET缓存过期策略。

◆永不过期。直接赋值缓存的Key和Value即可

◆绝对时间过期。DateTime.Now.AddSeconds(10)表示缓存在10秒后过期,TimeSpan.Zero表示不使用平滑过期策略。

◆变化时间过期(平滑过期)。DateTime.MaxValue表示不使用绝对时间过期策略,TimeSpan.FromSeconds(10)表示缓存连续10秒没有访问就过期。

在这里,我们都使用了Insert()方法来添加缓存。其实,Cache还有一个Add()方法也能向缓存中添加项。不同之处在于Add()方法只能添加缓存中没有的项,如果添加缓存中已有的项将失败(但不会抛出异常),而Insert()方法能覆盖原来的项。

注意:和Application不同,这里不需要使用在插入ASP.NET缓存的时候进行锁操作,Cache会自己处理并发。

 来源网址:http://developer.51cto.com/art/200907/140170.htm

资料二:(个人认为这个说的比较全面)

.net中的缓存技术:
 缓存是一项在计算中广泛用来提高性能的技术,它将访问频率高的数据或构造成本高的数据存储在内存中。
 在web开发中,性能是应用程序好坏的一个重要因素,而缓存对提高性能带来很大的帮助。让我们来看看缓存能解决的问题: 
1. 性能——将相应数据存储起来以避免数据的重复创建、处理和传输,可有效提高性能。比如将不改变的数据缓存起来,例如国家列表等,这样能明显提高web程序的反应速度; 
2.稳定性——同一个应用中,对同一数据、逻辑功能和用户界面的多次请求时经常发生的。当用户基数很大时,如果每次请求都进行处理,消耗的资源是很大的浪费,也同时造成系统的不稳定。 
3.可用性——有时,提供数据信息的服务可能会意外停止,如果使用了缓存技术,可以在一定时间内仍正常提供对最终用户的支持,提高了系统的可用性。
 
然后让我们来看看在asp.net中的缓存:
1.在asp.net中,提供了专门用于缓存数据的cache对象,它的应用范围是应用程序域。生存期是和应用程序紧密相关的,每当应用程序启动的时候就重新创建cache对象。它与application对象的主要区别就是提供了专门用于缓存管理的特性,比如依赖和过期策略。 
2.cache对象定义在system.web.caching命名空间,可以使用httpcontext类的cache属性或page对象的cache属性来得到cache的引用,cache对象除了存储键值对以外,还可以存储.net框架的对象。
 
缓存是把数据保存在内存以便下次调用,但是数据更新后,内存中的数据并没有更新,仍然是以前的数据,要怎样使缓存的数据也更新呢?我们采用依赖和过期策略。有三个方法可以实现:
1.文件依赖(file dependency)
2.键值依赖(key dependency) 
3.基于时间的过期策略
 
首先我们来看文件依赖。文件依赖就是当硬盘上的某个(某些)文件更改时,强制移除缓存数据。
例:
  cachedependency dep = new cachedependency(server.mappath("file.xml"));
  cache.insert("key", "value", dep);
注意:文件依赖项是通过使用 cache.insert 并提供引用 xml 文件的 cachedependency 对象添加的。
 
键值依赖,指定缓存中的某个数据项更改时移除。
比如我们有key1和key2两个缓存,key2是键值依赖于key1的,但key1发生变化,key2就失效。
例:
//创建key1缓存
cache["key1"]="key1 value";
//是缓存key2键值依赖于key1
string[] dependencykey=new string[1];
dependencykey[0]="key1";
cachedependency dep=new cachedependency(null,dependencykey);
cache.insert("key2", "value2", dep);
 
基于时间的过期策略,按照预先定义的时间策略来使数据失效,可以是绝对时间(如某个日期的18:00)也可以是相对现在的相对时间。使用太短和太长的过期时间都不行,不是造成用不上的缓存数据,就是缓存了陈旧的数据并加重了缓存负担,所以可以使用高并发的测试来决定过期时间的最佳值。
例:
//绝对时间过期
cache.insert("dsn", connectionstring, null, datetime.now.addminutes(2), system.web.caching.cache.noslidingexpiration);
//相对时间过期(即上文提到的“滑动过期”或者“平滑过期”)
cache.insert("dsn", connectionstring, null, system.web.caching.cache.noabsoluteexpiration, timespan.fromseconds(10));


相似写法:
context.Cache.Insert(cacheKey, temp, dp, DateTime.MaxValue, TimeSpan.Zero);

--------------------------------------- 2013-7-10 begin ---------------------------------------
[MethodImpl(MethodImplOptions.Synchronized)] //对此方法实现线程同步
        public void TestCache()
        {
            //add
            System.Web.Caching.CacheDependency dp = new System.Web.Caching.CacheDependency(null, null);
            HttpContext.Current.Cache.Add("key", "value", dp, DateTime.Now.AddHours(2), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);

            HttpContext.Current.Cache.Insert("key", "value");
            HttpContext.Current.Cache.Insert("key", "value", dp);

            //get
            Object cache = HttpContext.Current.Cache["key"];

            //remove
            HttpContext.Current.Cache.Remove("key");
        }
--------------------------------------- 2013-7-10 end ---------------------------------------

.NET4缓存过期策略摘录