Cache[转载]
1.Cache的概述
Cache和Application一样是整个应用程序公用的一份,而且所有的用户访问的都是相同的Cache 计算机系统本身就是一个多级缓存的结构,CPU的缓存中存放了部分内存中的数据,内存中存放了部分硬盘中的数据 缓存中的数据其实是来自数据库的,一般来说,缓存中应该存放改动不大或者对数据的实时性没有太多要求的数据,只需定期更新缓存就可以了
ASP.NET中的Cache提供的缓存过期策略: 永不过期:和Application一样,缓存永不过期 绝对时间过期:缓存在某一时间过期,比如5分钟后 变化时间过期(平滑过期):缓存在某一时间内未访问则超过过期 依赖过期:缓存依赖于数据库中的数据或者文件中的内容,一旦数据库中或某些表的数据发生变化或者文件内容发生变动,则缓存自动过期
2.添加缓存
DataSet ds=GetDate();
Cache.Insert("Data",ds); //永不过期的缓存,直接赋值缓存的Key和Value即可
Cache.Insert("Data",ds,null,DateTime.Now.AddSeconds(10),TimeSpan.Zero); //绝对时间过期,DateTime.Now.AddSeconds(10)表示缓存在10秒后过期,TimeSpan.Zero表示不适用平缓过期策略
Cache.Insert("Data",ds,null,DateTime.MaxValue,TimeSpan.FromSeconds(10)); //变化时间过期,DateTime.MaxValue表示不适用绝对时间过期策略,TimeSpan.FromSeconds(10)表示缓存连续10秒没有访问就过期
CacheDependency cd=new CacheDependency(Server.MapPath("text.txt")); Cache.Insert("Data",ds,cd); //添加文件依赖缓存
在这里,我们都是用了Insert()方法来添加缓存,其实,Cache还有一个Add()方法也能向缓存中添加项,不同之处在于Add()方法只能添加缓存中没有 的项,如果添加缓存中已有的项将失败,而Insert()方法能覆盖原来的项
3.Cache的更新策略
在Web程序中我们通常会使用被动更新,所谓被动更新,就是在调用数据的时候判断缓存是否为空,如果为空则先更新缓存然后再从缓存中读取数据,如果不为空,则直接从缓存中读取数据
如果没有人访问数据是不会更新的,只有缓存被访问的时候发现缓存无效才会去更新,这样一个很明显的缺点是,如果缓存过期了更新操作将花费很长时间,这个时候的查询也需要花费很多时间,我们可以利用缓存的回调功能让缓存过期后自动续建实现自动更新的目的,如下代码:
Cache.Insert("Data",ds,null,DateTime.Now.AddSenconds(0),TimeSpan.Zero,CacheItemPriority.Default,CacheRemovedCallback);
最后一个参数表明缓存被移除后自动调用CacheRemovedCallback()方法,方法实现如下: private void CacheRemovedCallback(String key,object value,CacheItemRemovedReason removedReason) { DataSet ds=GetData(); Cache.Insert(key,ds,null,DateTime.Now.AddSeconds(10),TimeSpan.Zero,CacheItemPriority.Default,CacheRemovedCallback); }
在回调方法中,我们再次插入一个支持回调的缓存,这样,缓存被移除后又能自动更新了
4.移除缓存 Cache.Remove("Data"); 因为Cache没有RemoveAll()方法,所以如果移除所有的缓存,则只能通过遍历来实现移除所有缓存:
IDictionaryEnumerator CacheEnum =HttpRuntime.Cache.GetEnumerator(); while(CacheEnum.MoveNext()) { Cache.Remove(CacheEnum.key.ToString()); }
5.Cache总结
存储的物理位置:服务器内存 存储的类型限制:任意类型 状态使用的范围:当前请求的上下文,所有用户共有一份 存储的大小限制:任意大小 生命周期:有多种过期策略控制缓存的销毁 安全与性能:数据总是存储在服务端,安全性比较高,但不宜存储过多的数据 优缺点与注意事项:检索数据速度快,过期策略丰富,注意别把对实时性要求很高的数据受到Cache中,不断更新Cache会对数据库造成压力