步步为营-79-缓存
缓存Cache,一种空间换取时间的技术,适用于经常访问,不常修改的数据.
1 写入缓存
1.1 方法一 Cache["message"]="ab";
1.2 方法二 Cache.insert("message","ab");
1.3 其他重载 Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);
参数: key:用于引用该对象的缓存键。
value: 要插入缓存中的对象。
dependencies: 该项的文件依赖项或缓存键依赖项。 当任何依赖项更改时,该对象即无效,并从缓存中移除。 如果没有依赖项,则此参数包含 null。
absoluteExpiration:所插入对象将到期并被从缓存中移除的时间。 如果使用绝对到期,则 slidingExpiration 参数必须为 System.Web.Caching.Cache.NoSlidingExpiration。
slidingExpiration: 最后一次访问所插入对象时与该对象到期时之间的时间间隔。如果使用可调到期,则 absoluteExpiration 参数必须为 System.Web.Caching.Cache.NoAbsoluteExpiration。
priority:该对象相对于缓存中存储的其他项的成本,由 System.Web.Caching.CacheItemPriority 枚举表示。 该值由缓存在退出对象时使用;具有较低成本的对象在具有较高成本的对象之前被从缓存移除。
onRemoveCallback: 在从缓存中移除对象时将调用的委托(如果提供)。 当从缓存中删除应用程序的对象时,可使用它来通知应用程序。
1.4 缓存移除的4个原因
CacheItemRemovedReason:
Removed = 1, System.Web.Caching.Cache.Remove(System.String) 方法调用从缓存中移除的。
Expired = 2,从缓存移除该项的原因是它已过期。
Underused = 3, 之所以从缓存中移除该项,是因为系统要通过移除该项来释放内存。
DependencyChanged = 4, 从缓存移除该项的原因是与之关联的缓存依赖项已更改。
2 例子
2.1 Demo
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Caching; namespace CacheTest { public partial class CacheDemo : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //01 假设字符串abc是来自于数据库 string str = "abc,来至于数据库"; //02 将数据写入缓存中 if (Cache["message"] == null) { Cache.Insert("message", str, null, DateTime.Now.AddSeconds(5), Cache.NoSlidingExpiration, CacheItemPriority.Low, RemoveCache); Response.Write("数据来自于数据库"); } else { Response.Write("数据来自于缓存"); } } //根据委托构造方法 private void RemoveCache(string key, object value, CacheItemRemovedReason reason) { if (reason ==CacheItemRemovedReason.Expired ) { } } } }
2.2 页面缓存
<%@ OutputCache Duration="5" VaryByParam="*" %>
Duration表示缓存时间,以秒为单位,超过这个时间则缓存失效
VaryByParam=“id”,表示对于相同页面的不同的id参数进行单独缓存。如果有多个确定缓存的参数,则将参数名用分号隔开即可,比如VaryByParam=“id;number”.如果想让任何不同的查询字符串都创建不同的缓存,则设置VaryByParam="*"
这个缓存是在服务器缓存的,不是在客户端,因为客户端还不断向服务器提交的请求的,只不过服务器看到有缓存就没有再执行页面类。
2.3 文件缓存依赖(当页面被访问时,从文本文件中读取数据)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Caching; using System.IO; namespace CacheTest { public partial class _03文件缓存依赖 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //01获取文件 string filePath = Request.MapPath("被访问的文本文件.txt"); if (Cache["fileContent"] == null) { //读取文件 string fileContent = File.ReadAllText(filePath); //文件缓存依赖---如果文件发生变化,就会清楚缓存 CacheDependency cdd = new CacheDependency(filePath); Cache.Insert("fileContent", fileContent, cdd); Response.Write("数据来自于文件"); } else { Response.Write("数据来自于缓存" + Cache["fileContent"].ToString()); } } } }