Cache有多种翻译,能够是高速缓冲存储器,也能够是法国的服装品牌,本文只是简单的谈谈就是ASP.NET 中Cache,作过Web应用程序的都知道,若是网站访问量比较大,系统应用程序能够将那些频繁访问的数据,以及那些须要大量处理时间来建立的数据存储在内存中,从而提升性能。 举一个很简单的例子,若是在博客园发布文章到首页,发布以后是不能即时看到本身的文章的,大概一分钟以后才能刷出数据,这就是经常使用的页面缓存.缓存分为两种,通常都是页面缓存以及应用程序缓存。html
页面输出缓存是一类针服务器应用程序的典型缓存。 利用输出缓存,能够存储呈现的 HTML。 提供存储的 HTML 以响应相同页的后续请求。 可以使用输出缓存来缓存整个网页或仅缓存 ASP.NET 控件的输出。页输出缓存在内存中存储处理后的 ASP.NET 页的内容。 这可以让 ASP.NET 向客户端发送页响应,而没必要再次通过页处理生命周期。 页输出缓存对于那些不常常更改,但须要大量处理才能建立的页特别有用。 例如,若是建立大通讯量的网页来显示不须要频繁更新的数据,页输出缓存则能够极大地提升该页的性能。 能够分别为每一个页配置页缓存,也能够在 Web.config 文件中建立缓存配置文件。利用缓存配置文件,只定义一次缓存设置就能够在多个页中使用这些设置。前端
首先看一个经常使用的,用来控制页面或者用户控制输出的持续输出30s时间,WebForm只须要在aspx页面写个OutPutCache:web
<%@ OutputCache Duration="30" VaryByParam="None" %>
asp.net mvc页面生命周期跟WebForm那一套不同,这个时候就须要在Action动手改改:数据库
[OutputCache(Duration = 30,VaryByParam="none")] public ActionResult CacheTest() { return View(); }
页面缓存的实现和处理方式有不少种,先从OutPutCache中的各类特性的,每种特性,对应着不一样的实现方式:编程
<%@ OutputCache Duration="100"(必填) Location="Any | Client | Downstream | Server | None | ServerAndClient " Shared="True | False" VaryByControl="控件名称" VaryByCustom="Test" VaryByHeader="headers" VaryByParam="parametername" VaryByContentEncoding="encodings" CacheProfile="cache profile name | ''" NoStore="true | false" SqlDependency="database/table name pair | CommandNotification" ProviderName="Provider Name" %>
OutPutCache上面的设置很简单,Duration是必填的,页或用户控件进行缓存的时间(秒),Location是指定缓存的位置,由枚举OutputCacheLocation来肯定,包含在用户控件(.ascx 文件)中的 @ OutputCache 指令不支持此特性。数组
VaryByControl一个分号分隔的字符串列表,用于更改用户控件的输出缓存。 这些字符串表明用户控件中声明的 ASP.NET 服务器控件的 ID 属性值,在 ASP.NET 页和用户控件上使用 @ OutputCache 指令时,须要此特性或 VaryByParam 特性,有的时候咱们缓存整个页面确定不是太现实的,不少状况下只是缓存一部分页面,新建一个用户控件:浏览器
1 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Test.ascx.cs" Inherits="MyWebForm.Test" %> 2 <%@ OutputCache Duration="5" VaryByParam="None" %> 3 <% string t = DateTime.Now.ToString(); 4 Response.Write(t); %>
在aspx页面中使用用户控件:缓存
1 <%@ Register Src="~/Test.ascx" TagPrefix="uc1" TagName="Test" %> 2 <%@ OutputCache Duration="10" VaryByParam="None" %> 3 <uc1:Test runat="server" ID="Test1" />
这里面涉及到一个问题,就是页面设置的时间和控件设置的时间,页面是10s,控件是5s,控件与页面都是10s刷一次,以页面时间为主;若是页面是10s,控件是20s,那么页面10s刷一次,控件20s刷一次,简单点理解就是控件以时间长的为主;服务器
asp.net mvc 中ascx全部的功能就是View页面,跟局部视图调用同样,新建一个Test.ascx,经过控制器去访问:mvc
1 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 2 <% string t = DateTime.Now.ToString(); Response.Write(t); %>
1 [OutputCache(Duration=5,VaryByParam="none")] 2 public ActionResult Test() 3 { 4 Response.Cache.SetOmitVaryStar(true); 5 return View(); 6 }
注意:控制器多加了Response.Cache.SetOmitVaryStar(true),这个Bug还比较隐蔽,详情可参考:
http://www.cnblogs.com/dudu/archive/2012/08/27/asp_net_mvc_outputcache.html
VaryByCustom表示自定义输出缓存要求的任意文本。 若是特性的赋值为 browser,缓存将随浏览器名称和主要版本信息的不一样而异。 若是输入自定义字符串,则必须在应用程序的 Global.asax 文件中重写 GetVaryByCustomString方法, 根据用户的主机名或者浏览器起版本给出缓存,不存在的话就须要新建缓存,若是存在话就不须要新建缓存。
public override string GetVaryByCustomString(HttpContext context, string arg) { if (arg == "Test") { return "浏览器版本=" + context.Request.Browser.MinorVersion.ToString(); //return "用户主机=" + // context.Request.UserHostName; } return base.GetVaryByCustomString(context, arg); }
VaryByHeader
分号分隔的 HTTP 标头列表,用于使输出缓存发生变化。 将该特性设为多标头时,对于每一个指定标头组合,输出缓存都包含一个不一样版本的请求文档。设置 VaryByHeader 特性将启用在全部 HTTP 1.1 版缓存中缓存项,而不只仅在 ASP.NET 缓存中进行缓存。 用户控件中的 @ OutputCache指令不支持此特性。
VaryByParam
分号分隔的字符串列表,用于使输出缓存发生变化。 默认状况下,这些字符串对应于使用 GET 方法特性发送的查询字符串值,或者使用 POST 方法发送的参数。 将该特性设置为多个参数时,对于每一个指定参数组合,输出缓存都包含一个不一样版本的请求文档。 可能的值包括 none、星号 (*) 以及任何有效的查询字符串或 POST 参数名称。
页面经过URL连接访问,要缓存页面,百分之九十的状况的下页面是会有参数传递的,若是你设置为none,那么你用get或者post请求的时候是不会缓存的,设为*是最简单的什么都不用管,若是你只想查name的时候缓存一下,那么你直接设置一下就行.
[OutputCache(Duration = 30,VaryByParam="name")] public ActionResult CacheTest(string name) { if (name=="1") { ViewData["Test"] = "测试"; } return View(); }
CacheProfile
配置文件中设置缓存。 这是可选特性,默认值为空字符串 ("")。包含在用户控件(.ascx 文件)中的 @ OutputCache 指令不支持此特性。 在页中指定此属性时,属性值必须与 outputCacheSettings 节下面的 outputCacheProfiles 元素中的一个可用项的名称匹配。 若是此名称与配置文件项不匹配,将引起异常。
[OutputCache(CacheProfile = "myProfile",VaryByParam="none")] public ActionResult Test() { Response.Cache.SetOmitVaryStar(true); return View(); }
<system.web> <caching> <outputCacheSettings> <outputCacheProfiles> <add name="myProfile" duration="10"/> </outputCacheProfiles> </outputCacheSettings> </caching> </system.web>
Shared一个布尔值,肯定用户控件输出是否能够由多个页共享。 默认值为 false,包含在 ASP.NET 页(.aspx 文件)中的 @ OutputCache 指令不支持此特性。
NoStore一个布尔值,它决定了是否阻止敏感信息的二级存储。在用户控件(ascx)中使用的时候须要注意加上Response.Cache.SetNoStore();
SqlDependency标识一组数据库/表名称对的字符串值,页或控件的输出缓存依赖于这些名称对。
ProviderName 一个字符串值,标识要使用的自定义输出缓存提供程序。
VaryByContentEncodings 以分号分隔的字符串列表,用于更改输出缓存。
应用程序缓存提供了一种编程方式,可经过键/值对将任意数据存储在内存中。 使用应用程序缓存与使用应用程序状态相似。 可是,与应用程序状态不一样的是,应用程序缓存中的数据是易失的, 即数据并非在整个应用程序生命周期中都存储在内存中。 使用应用程序缓存的优势是由 ASP.NET 管理缓存,它会在项过时、无效、或内存不足时移除缓存中的项。 还能够配置应用程序缓存,以便在移除项时通知应用程序。使用应用程序缓存的模式是,肯定在访问某一项时该项是否存在于缓存中,若是存在,则使用。 若是该项不存在,则能够从新建立该项,而后将其放回缓存中。 这一模式可确保缓存中始终有最新的数据。
经过键和值直接设置项向缓存赋值
List<Person> list = new List<Person>(){new Person(){Name="Small",Age=24}, new Person(){Name="Fly",Age=24}, new Person(){Name="Elephant",Age=24}}; Cache["Test"] = list;
Insert的方式
Cache.Insert("Fly", "缓存2");
添加依赖项,能够是其余已存在的缓存,也能够是已存在的文件:
Cache.Insert("Fly", "缓存2"); Cache.Insert("Elephant", "缓存3",new CacheDependency(null, new string[]{"Fly"}));//key为Elephant, value为缓存3,依赖于key为Fly的缓存
Cache.Insert("Elephant", "缓存3",new CacheDependency(Server.MapPath("路径")));
插入多个缓存依赖
CacheDependency dep1 = new CacheDependency(null, new string[] { "Fly" }); CacheDependency dep2 = new CacheDependency(Server.MapPath("路径")); AggregateCacheDependency cacheList = new AggregateCacheDependency(); cacheList.Add(dep1); cacheList.Add(dep2); Cache.Insert("Elephant", "缓存3",cacheList);
绝对过时和滑动过时这个两个名字比较有意,绝对过时枚举英文是NoSlidingExpiration(不滑动),滑动过时NoAbsoluteExpiration(不绝对),这里面还设置了CacheItemPriority,这枚举你们本身看下就行,还有一个自动删除,缓存到期后执行删除方法:
//绝对过时时间的时间为30s,过完30s以后就没有缓存 Cache.Insert("Tiger", "老虎",null, DateTime.Now.AddSeconds(30), Cache.NoSlidingExpiration,CacheItemPriority.High,Show); //滑动过时时间的时间为1分钟,只要一直刷新一直有,若是刷新间隔超过一分钟的缓存就没啦 Cache.Insert("Dragon", "龙", null, Cache.NoAbsoluteExpiration,new TimeSpan(0, 0, 60)); public void Show(string key, object value, CacheItemRemovedReason call) { if (key=="Pig") { Cache.Remove("Pig"); } }
Add的形式(该方法没有重载)
Cache.Add("Cow", "牛", null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default, null);
ASP.NET 1到3.5中的输出缓存有一个限制,就是缓存存储自己不是可扩展的,ASP.NET 4.0以后是支持缓存扩展的。 经过缓存的扩展,能够保存HTML页面或者内存中的数据, 这些存储选项包括本地或远程磁盘、云存储和分布式缓存引擎。ASP.NET 中的输出缓存提供程序扩展性,能够为网站设计更好的输出缓存策略。 例如,能够建立这样一个输出缓存提供程序,该程序在内存中缓存站点流量排名靠前的页面,而在磁盘上缓存流量较低的页面,也能够对所呈现页面的各类变化因素组合进行缓存,但应使用分布式缓存以减小前端 Web 服务器的内存消耗。实现可扩展,须要建立一个继承自 OutputCacheProvider 的类:
public class MyCacheProvide : OutputCacheProvider { public override object Add(string key, object entry, DateTime utcExpiry) { throw new NotImplementedException(); } public override object Get(string key) { throw new NotImplementedException(); } public override void Remove(string key) { throw new NotImplementedException(); } public override void Set(string key, object entry, DateTime utcExpiry) { throw new NotImplementedException(); } }
而后配置文件中进行相应配置:
<caching> <outputCache defaultProvider="AspNetInternalProvider"> <providers> <add name="DiskCache" type="MyWeb.Controllers.MyCacheProvide, MyWeb" /> </providers> </outputCache> </caching>
默认状况下,全部 HTTP 响应、所呈现的页面和控件(其中 defaultProvider 特性设置为 AspNetInternalProvider)所示的内存输出缓存。经过为 defaultProvider 指定不一样的提供程序名称,能够更改用于 Web 应用程序的默认输出缓存提供程序。默认值为“AspNetInternalProvider", 这是 ASP.NET 提供的内存缓存。