.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); } System.Web.Caching.Cache貼一些測試代碼 沒有全部測試
//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這里有更詳細的介紹: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); } OutputCacheAttribute貼幾個示例:也沒有全部測試,基本格式都一樣
[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秒之后就會失效
就寫這么多吧 有時間了再補充
轉載于:https://www.cnblogs.com/atxgs/articles/4482960.html
總結
以上是生活随笔為你收集整理的.Net缓存小结(中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零开始,手把手教会你5分钟用SPARK
- 下一篇: history巧用