.Net缓存小结(中)
System.Web.Caching.Cache
Cache:用于在Http请求期间保存页面或者数据。Cache的使用可以大大的提高整个应用程序的效率。它允许将频繁访问的服务器资源存储在内存中,当用户发出相同的请求后服务器不是再次处理而是将Cache中保存的数据直接返回给用户,可以看出Cache节省的时间是服务器处理的时间。Cache实例是每一个应用程序专有的,其生命周期就是应用程序周期,应用程序重启将重新创建其实例。
注意:如果要使用缓存的清理、到期管理、依赖项等功能必须使用Insert或者Add方法方法添加信息
Cache所具有的功能
// 实现用于 Web 应用程序的缓存。 此类不能被继承。 public sealed class Cache : IEnumerable { // 摘要: // 用于 System.Web.Caching.Cache.Insert(System.String,System.Object) 方法调用中的 absoluteExpiration // 参数中以指示项从不到期。 此字段为只读。 public static readonly DateTime NoAbsoluteExpiration; // // 摘要: // 用作 System.Web.Caching.Cache.Insert(System.String,System.Object) 或 System.Web.Caching.Cache.Add(System.String,System.Object,System.Web.Caching.CacheDependency,System.DateTime,System.TimeSpan,System.Web.Caching.CacheItemPriority,System.Web.Caching.CacheItemRemovedCallback) // 方法调用中的 slidingExpiration 参数,以禁用可调到期。 此字段为只读。 public static readonly TimeSpan NoSlidingExpiration; // 摘要: // 初始化 System.Web.Caching.Cache 类的新实例。 public Cache(); // 摘要: // 获取存储在缓存中的项数。 // // 返回结果: // 存储在缓存中的项数。 public int Count { get; } // // 摘要: // 获取在 ASP.NET 开始从缓存中移除项之前应用程序可使用的物理内存百分比。 // // 返回结果: // 可供应用程序使用的物理内存百分比。 public long EffectivePercentagePhysicalMemoryLimit { get; } // // 摘要: // 获取可用于缓存的字节数。 // // 返回结果: // 可用于缓存的字节数。 public long EffectivePrivateBytesLimit { get; } // 摘要: // 获取或设置指定键处的缓存项。 // // 参数: // key: // 表示缓存项的键的 System.String 对象。 // // 返回结果: // 指定的缓存项。 public object this[string key] { get; set; } // 摘要: // 将指定项添加到 System.Web.Caching.Cache 对象,该对象具有依赖项、到期和优先级策略以及一个委托(可用于在从 Cache 移除插入项时通知应用程序)。 // // 参数: // key: // 用于引用该项的缓存键。 // // value: // 要添加到缓存的项。 // // dependencies: // 该项的文件依赖项或缓存键依赖项。 当任何依赖项更改时,该对象即无效,并从缓存中移除。 如果没有依赖项,则此参数包含 null。 // // absoluteExpiration: // 所添加对象将到期并被从缓存中移除的时间。 如果使用可调到期,则 absoluteExpiration 参数必须为 System.Web.Caching.Cache.NoAbsoluteExpiration。 // // slidingExpiration: // 最后一次访问所添加对象时与该对象到期时之间的时间间隔。 如果该值等效于 20 分钟,则对象在最后一次被访问 20 分钟之后将到期并从缓存中移除。 // 如果使用绝对到期,则 slidingExpiration 参数必须为 System.Web.Caching.Cache.NoSlidingExpiration。 // // priority: // 对象的相对成本,由 System.Web.Caching.CacheItemPriority 枚举表示。 缓存在退出对象时使用该值;具有较低成本的对象在具有较高成本的对象之前被从缓存移除。 // // onRemoveCallback: // 在从缓存中移除对象时所调用的委托(如果提供)。 当从缓存中删除应用程序的对象时,可使用它来通知应用程序。 // // 返回结果: // 如果添加的项之前存储在缓存中,则为表示该项的对象;否则为 null。 // // 异常: // System.ArgumentNullException: // key 或 value 参数设置为 null。 // // System.ArgumentOutOfRangeException: // slidingExpiration 参数设置成小于 TimeSpan.Zero 或大于一年。 // // System.ArgumentException: // 为要添加到 Cache 中的项设置 absoluteExpiration 和 slidingExpiration 参数。 public object Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback); // // 摘要: // 从 System.Web.Caching.Cache 对象检索指定项。 // // 参数: // key: // 要检索的缓存项的标识符。 // // 返回结果: // 检索到的缓存项,未找到该键时为 null。 public object Get(string key); // // 摘要: // 检索用于循环访问包含在缓存中的键设置及其值的字典枚举数。 // // 返回结果: // 要循环访问 System.Web.Caching.Cache 对象的枚举数。 public IDictionaryEnumerator GetEnumerator(); // // 摘要: // 向 System.Web.Caching.Cache 对象插入项,该项带有一个缓存键引用其位置,并使用 System.Web.Caching.CacheItemPriority // 枚举提供的默认值。 // // 参数: // key: // 用于引用该项的缓存键。 // // value: // 要插入缓存中的对象。 // // 异常: // System.ArgumentNullException: // key 或 value 参数为 null。 public void Insert(string key, object value); // // 摘要: // 向 System.Web.Caching.Cache 中插入具有文件依赖项或键依赖项的对象。 // // 参数: // key: // 用于标识该项的缓存键。 // // value: // 要插入缓存中的对象。 // // dependencies: // 所插入对象的文件依赖项或缓存键依赖项。 当任何依赖项更改时,该对象即无效,并从缓存中移除。 如果没有依赖项,则此参数包含 null。 // // 异常: // System.ArgumentNullException: // key 或 value 参数为 null。 public void Insert(string key, object value, CacheDependency dependencies); // // 摘要: // 向 System.Web.Caching.Cache 中插入具有依赖项和到期策略的对象。 // // 参数: // key: // 用于引用该对象的缓存键。 // // value: // 要插入缓存中的对象。 // // dependencies: // 所插入对象的文件依赖项或缓存键依赖项。 当任何依赖项更改时,该对象即无效,并从缓存中移除。 如果没有依赖项,则此参数包含 null。 // // absoluteExpiration: // 所插入对象将到期并被从缓存中移除的时间。 要避免可能的本地时间问题(例如从标准时间改为夏时制),请使用 System.DateTime.UtcNow // 而不是 System.DateTime.Now 作为此参数值。 如果使用绝对到期,则 slidingExpiration 参数必须为 System.Web.Caching.Cache.NoSlidingExpiration。 // // slidingExpiration: // 最后一次访问所插入对象时与该对象到期时之间的时间间隔。 如果该值等效于 20 分钟,则对象在最后一次被访问 20 分钟之后将到期并被从缓存中移除。 // 如果使用可调到期,则 absoluteExpiration 参数必须为 System.Web.Caching.Cache.NoAbsoluteExpiration。 // // 异常: // System.ArgumentNullException: // key 或 value 参数为 null。 // // System.ArgumentOutOfRangeException: // 将 slidingExpiration 参数设置为小于 TimeSpan.Zero 或大于一年的等效值。 // // System.ArgumentException: // 为要添加到 Cache 中的项设置 absoluteExpiration 和 slidingExpiration 参数。 public void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration); // // 摘要: // 将对象与依赖项、到期策略以及可用于在从缓存中移除项之前通知应用程序的委托一起插入到 System.Web.Caching.Cache 对象中。 // // 参数: // key: // 用于引用对象的缓存键。 // // value: // 要插入到缓存中的对象。 // // dependencies: // 该项的文件依赖项或缓存键依赖项。 当任何依赖项更改时,该对象即无效,并从缓存中移除。 如果没有依赖项,则此参数包含 null。 // // absoluteExpiration: // 所插入对象将到期并被从缓存中移除的时间。 要避免可能的本地时间问题(例如从标准时间改为夏时制),请使用 System.DateTime.UtcNow // 而不是 System.DateTime.Now 作为此参数值。 如果使用绝对到期,则 slidingExpiration 参数必须设置为 System.Web.Caching.Cache.NoSlidingExpiration。 // // slidingExpiration: // 缓存对象的上次访问时间和对象的到期时间之间的时间间隔。 如果该值等效于 20 分钟,则对象在最后一次被访问 20 分钟之后将到期并被从缓存中移除。 // 如果使用可调到期,则 absoluteExpiration 参数必须设置为 System.Web.Caching.Cache.NoAbsoluteExpiration。 // // onUpdateCallback: // 从缓存中移除对象之前将调用的委托。 可以使用它来更新缓存项并确保缓存项不会从缓存中移除。 // // 异常: // System.ArgumentNullException: // key、value 或 onUpdateCallback 参数为 null。 // // System.ArgumentOutOfRangeException: // 将 slidingExpiration 参数设置为小于 TimeSpan.Zero 或大于一年的等效值。 // // System.ArgumentException: // 为要添加到 Cache 中的项设置 absoluteExpiration 和 slidingExpiration 参数。 - 或 - dependencies // 参数为 null,absoluteExpiration 参数设置为 System.Web.Caching.Cache.NoAbsoluteExpiration // 并且 slidingExpiration 参数设置为 System.Web.Caching.Cache.NoSlidingExpiration。 public void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemUpdateCallback onUpdateCallback); // // 摘要: // 向 System.Web.Caching.Cache 对象中插入对象,后者具有依赖项、到期和优先级策略以及一个委托(可用于在从 Cache 移除插入项时通知应用程序)。 // // 参数: // key: // 用于引用该对象的缓存键。 // // value: // 要插入缓存中的对象。 // // dependencies: // 该项的文件依赖项或缓存键依赖项。 当任何依赖项更改时,该对象即无效,并从缓存中移除。 如果没有依赖项,则此参数包含 null。 // // absoluteExpiration: // 所插入对象将到期并被从缓存中移除的时间。 要避免可能的本地时间问题(例如从标准时间改为夏时制),请使用 System.DateTime.UtcNow // 而不是 System.DateTime.Now 作为此参数值。 如果使用绝对到期,则 slidingExpiration 参数必须为 System.Web.Caching.Cache.NoSlidingExpiration。 // // slidingExpiration: // 最后一次访问所插入对象时与该对象到期时之间的时间间隔。 如果该值等效于 20 分钟,则对象在最后一次被访问 20 分钟之后将到期并被从缓存中移除。 // 如果使用可调到期,则 absoluteExpiration 参数必须为 System.Web.Caching.Cache.NoAbsoluteExpiration。 // // priority: // 该对象相对于缓存中存储的其他项的成本,由 System.Web.Caching.CacheItemPriority 枚举表示。 该值由缓存在退出对象时使用;具有较低成本的对象在具有较高成本的对象之前被从缓存移除。 // // onRemoveCallback: // 在从缓存中移除对象时将调用的委托(如果提供)。 当从缓存中删除应用程序的对象时,可使用它来通知应用程序。 // // 异常: // System.ArgumentNullException: // key 或 value 参数为 null。 // // System.ArgumentOutOfRangeException: // 将 slidingExpiration 参数设置为小于 TimeSpan.Zero 或大于一年的等效值。 // // System.ArgumentException: // 为要添加到 Cache 中的项设置 absoluteExpiration 和 slidingExpiration 参数。 public void Insert(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback); // // 摘要: // 从应用程序的 System.Web.Caching.Cache 对象移除指定项。 // // 参数: // key: // 要移除的缓存项的 System.String 标识符。 // // 返回结果: // 从 Cache 移除的项。 如果未找到键参数中的值,则返回 null。 public object Remove(string key); }
贴一些测试代码 没有全部测试
//Cache测试方法 public static void CacheTest() { //创建缓存 Cache cache = HttpRuntime.Cache; cache.Insert("1", "我是静态缓存"); cache.Insert("2", "我是依赖一个文件,", new CacheDependency(@"D:\1.txt")); cache.Insert("3", "我是绝对到期时间,创建后10秒过期", null, DateTime.Now.AddSeconds(10), Cache.NoSlidingExpiration); cache.Insert("4", "我是弹性到期时间,超过10秒不用我,我就消失了", null, Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(10)); cache.Insert("5", "我可以设定优先级,哈哈", null, Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(10),CacheItemPriority.High, null); var addCache = cache.Add("5", "我是AddCache,添加相同名的cache我会返回之前的data,而却不执行任何操作,删除我会委托跳转哦", null, DateTime.Now.AddMinutes(10), Cache.NoSlidingExpiration, CacheItemPriority.Low, Notice); //获取缓存 var result = cache.Get("5").ToString(); //清除单个缓存 HttpRuntime.Cache.Remove("5"); //清空全部缓存 IDictionaryEnumerator emptyCache = HttpRuntime.Cache.GetEnumerator();//检索用于循环访问包含在缓存中的键设置及其值的字典枚举数。 int count = HttpRuntime.Cache.Count;//获取存储在缓存中的项数。 for (int i = 0; i < count; i++) { emptyCache.MoveNext();//将位置移动到下一个缓存项 HttpRuntime.Cache.Remove(emptyCache.Entry.Key.ToString());//清空缓存 } } /// <summary> /// 删除Add插入的cache时 委托的方法 /// </summary> /// <param name="key">cache 标志</param> /// <param name="value">cache 值</param> /// <param name="reason">Remove</param> public static void Notice(string key, object value, CacheItemRemovedReason reason) { Cache cache = HttpRuntime.Cache; var result = cache.Get("5"); }
这里有更详细的介绍:System.Web.Caching.Cache类 缓存 各种缓存依赖
输出缓存OutputCache
webform
OutputCache 以声明的方式控制 ASP.NET 页或页中包含的用户控件的输出缓存策略。
语法如下:
<%@ OutputCache=""
Duration="#ofseconds" //页或用户控件进行缓存的时间(以秒计)
//用于指定输出缓存项的位置。其属性值是OutputCacheLocation枚举值,它们是Any、Client、Downstream、None、 Server和ServerAndClient。
//默认值是Any,表示输出缓存可用于所有请求,包括客户端浏览器、代理服务器或处理请求的服务器上。
Location="Any | Client | Downstream | Server | None | ServerAndClient "
Shared="True | False" //确定用户控件输出是否可以由多个页共享
VaryByControl="controlname" //用于更改用户控件的输出缓存。这些字符串代表用户控件中声明的 ASP.NET 服务器控件的 ID 属性值。
//表示自定义输出缓存要求的任意文本。如果赋予该属性的值为 browser,缓存将随浏览器名称和主要版本信息的不同而异。
//如果输入自定义字符串,则必须在应用程序的 Global.asax 文件中重写 GetVaryByCustomString 方法。
VaryByCustom="browser | customstring"
VaryByHeader="headers" //根据HTTP响应头信息,缓存多个不同版本的响应文档 Accept-Language|User-Agent|Cookie
VaryByParam="parametername" //分号分隔的参数列表,用于使输出缓存发生变化
VaryByContentEncoding="encodings" //基于内容变化的编码,用于更改输出缓存
CacheProfile="cache profile name | ''" //Cache配置节名称
NoStore="true | false" //是否阻止敏感信息的二级存储
SqlDependency="database/table name pair | CommandNotification" //标识一组数据库/表名称对 的字符串值,页或控件的输出缓存依赖于这些名称对
ProviderName="Provider Name" //标识要使用的自定义输出缓存提供程序
%>
在web.config中配置outputcache:
<%@ OutputCache CacheProfile="CacheWebconfig" %>
Web.config
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="CacheWebconfig" duration="30"
varyByParam="none" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
Webconfig中Add节点里面的各个属性和OutPutCache相对应,OutputCache优先于outputCacheProfiles配置
.Net MVC
输出缓存在.net mvc中 封装成了一个特性OutputCacheAttribute 直接在控制器上加特性就能实现,功能如下:
// 摘要: // 表示一个特性,该特性用于标记将缓存其输出的操作方法。 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] public class OutputCacheAttribute : ActionFilterAttribute, IExceptionFilter { // 摘要: // 初始化 System.Web.Mvc.OutputCacheAttribute 类的新实例。 public OutputCacheAttribute(); // 摘要: // 获取或设置缓存配置文件名称。 // // 返回结果: // 缓存配置文件名称。 public string CacheProfile { get; set; } // // 摘要: // 获取或设置子操作缓存。 // // 返回结果: // 子操作缓存。 public static System.Runtime.Caching.ObjectCache ChildActionCache { get; set; } // // 摘要: // 获取或设置缓存持续时间(以秒为单位)。 // // 返回结果: // 缓存持续时间。 public int Duration { get; set; } // // 摘要: // 获取或设置位置。 // // 返回结果: // 位置。 public OutputCacheLocation Location { get; set; } // // 摘要: // 获取或设置一个值,该值指示是否存储缓存。 // // 返回结果: // 如果应存储缓存,则为 true;否则为 false。 public bool NoStore { get; set; } // // 摘要: // 获取或设置 SQL 依赖项。 // // 返回结果: // SQL 依赖项。 public string SqlDependency { get; set; } // // 摘要: // 获取或设置基于内容变化的编码。 // // 返回结果: // 基于内容变化的编码。 public string VaryByContentEncoding { get; set; } // // 摘要: // 获取或设置基于自定义项变化的值。 // // 返回结果: // 基于自定义项变化的值。 public string VaryByCustom { get; set; } // // 摘要: // 获取或设置基于标头变化的值。 // // 返回结果: // 基于标头变化的值。 public string VaryByHeader { get; set; } // // 摘要: // 获取或设置基于参数变化的值。 // // 返回结果: // 基于参数变化的值。 public string VaryByParam { get; set; } // 摘要: // 返回一个值,该值指示子操作缓存否处于活动状态。 // // 参数: // controllerContext: // 控制器上下文。 // // 返回结果: // 如果子操作缓存处于活动状态,则为 true;否则为 false。 public static bool IsChildActionCacheActive(ControllerContext controllerContext); // // 摘要: // 此方法是 System.Web.Mvc.IActionFilter.OnActionExecuted(System.Web.Mvc.ActionExecutedContext) // 的实现并支持 ASP.NET MVC 基础结构。它不应直接在您的代码中使用。 // // 参数: // filterContext: // 筛选器上下文。 public override void OnActionExecuted(ActionExecutedContext filterContext); // // 摘要: // 此方法是 System.Web.Mvc.IActionFilter.OnActionExecuting(System.Web.Mvc.ActionExecutingContext) // 的实现并支持 ASP.NET MVC 基础结构。它不应直接在您的代码中使用。 // // 参数: // filterContext: // 筛选器上下文。 public override void OnActionExecuting(ActionExecutingContext filterContext); // // 摘要: // 此方法是 System.Web.Mvc.IExceptionFilter.OnException(System.Web.Mvc.ExceptionContext) // 的实现并支持 ASP.NET MVC 基础结构。它不应直接在您的代码中使用。 // // 参数: // filterContext: // 筛选器上下文。 public void OnException(ExceptionContext filterContext); // // 摘要: // 此方法是 System.Web.Mvc.IResultFilter.OnResultExecuted(System.Web.Mvc.ResultExecutedContext) // 的实现并支持 ASP.NET MVC 基础结构。它不应直接在您的代码中使用。 // // 参数: // filterContext: // 筛选器上下文。 public override void OnResultExecuted(ResultExecutedContext filterContext); // // 摘要: // 在操作结果执行之前调用。 // // 参数: // filterContext: // 筛选器上下文,它封装有关使用 System.Web.Mvc.AuthorizeAttribute 的信息。 // // 异常: // System.ArgumentNullException: // filterContext 参数为 null。 public override void OnResultExecuting(ResultExecutingContext filterContext); }
贴几个示例:也没有全部测试,基本格式都一样
[OutputCache(Duration = 30)]//缓存整个页面30秒
public ActionResult Index(){...}
//根据Id值 缓存整个页面30秒 如果Id值改变 页面重新缓存 之前的页面没过期之前还是缓存状态再次访问时不会重新加载
[OutputCache(Duration = 30, VaryByContentEncoding = "id")]
public ActionResult Index(int? id){...}
//根据Http消息头信息值 缓存整个页面30秒 Accept-Language表示语言版本 当网站有多种语言版本时,可以为每种语言都进行缓存
[OutputCache(Duration = 30, VaryByHeader = "Accept-Language")]
public ActionResult Index(){...}
//用webconfig配置缓存
[OutputCache(Duration = 30, CacheProfile = "CacheTest")]
public ActionResult Index(){...}
//webconfig配置如下:
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="CacheTest" duration="60"
varyByParam="none" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>
OutputCache优先于outputCacheProfiles配置 所以缓存30秒之后就会失效
就写这么多吧 有时间了再补充