Cache的一些總結

輸出緩存

這是最簡單的緩存類型,它保存發送到客戶端的頁面副本,當下一個客戶端發送相同的頁面請求時,此頁面不會重新生成(在緩存有限期內),而是從緩存中獲取該頁面;當然由于緩存過期或被回收,這時頁面會重新生成。

我們要實現輸出緩存,只需在頁面中添加如下代碼:

<%@ OutputCache Duration="23" VaryByParam="None" %>

它支持五個屬性,其中兩個屬性Duration和VaryByParam是必填的

Duration

必需屬性。頁面應該被緩存的時間,以秒為單位。必須是正整數。

Location

指定應該對輸出進行緩存的位置。如果要指定該參數,則必須是下列選項之一:Any、Client、Downstream、None、Server 或 ServerAndClient。

VaryByParam

必需屬性。Request 中變量的名稱,這些變量名應該產生單獨的緩存條目。"none" 表示沒有變動。"*" 可用于為每個不同的變量數組創建新的緩存條目。變量之間用 ";" 進行分隔。

VaryByHeader

基于指定的標頭中的變動改變緩存條目。

VaryByCustom

允許在 global.asax 中指定自定義變動(例如,"Browser")。

表1輸出緩存屬性

這里我們把輸出緩存的有效期設置為23秒,也就是說,當緩存超過有效期就會被回收;當用戶再次請求該頁面時,就要重新創建頁面。

前面我們介紹了輸出緩存的使用,只需在頁面中添加OutputCache指令,假設我們要在幾個頁面中添加輸出緩存這可能比較簡單,但我們要在幾十個頁面中添加輸出緩存功能,而且前面介紹的例子中Duration屬性值都是直接Hard code到每個頁面中,如果我們需要修改Duration屬性值,那么就必須修改每個頁面了,ASP.NET還需要重新編譯這些頁面,這不利于我們的維護,最重要的是增加了我們的工作量。

其實,我們可以在web.config文件中定義一個outputCacheProfile(ProductCacheProfile),然后在頁面中添加CacheProfile屬性并且賦值為ProductCacheProfile,web.config文件設置如下:

<caching>

? <!-- Sets out put cache profile-->

? <outputCacheSettings>

??? <outputCacheProfiles>

????? <add name="ProductCacheProfile" duration="30"/>

??? </outputCacheProfiles>

? </outputCacheSettings>

</caching>

現在,我們在頁面中添加CacheProfile屬性,并且設置為ProductCacheProfile,如下所示:

<%@ OutputCache CacheProfile="ProductCacheProfile" VaryByParam="None" %>

客戶端緩存

另一種選擇是客戶端緩存,如果用戶在瀏覽器中點擊“后退”按鈕或在地址欄中重新輸入URL,那么在這種情況下,瀏覽器將從緩存獲取頁面;然而,如果用戶點擊“刷新”按鈕,那么瀏覽器中緩存將失效,瀏覽器發送頁面請求。

如果我們要使用客戶端緩存,只需指定OutputCache中的屬性Location=”Client”就OK了,具體代碼如下所示:

<%@ OutputCache Duration="23" VaryByParam="None" Location="Client" %>

Query String緩存

如果查詢參數和前一個請求相同并且該頁面緩存有效,那么緩存將被重用,否則,創建一個新的頁面緩存。

前面我們把VaryByParam設置為“*”,所以ASP.NET程序對ProductName和ProductId都創建頁面緩存

如果我們只針對ProductName創建頁面緩存,這時我們可以修改VaryByParam,具體如下所示:

<%@ OutputCache Duration="30" VaryByParam="productname" %>

自定義緩存控件

我們可以通過設置VaryByCustom屬性來實現。

假設,現在我們要設計基于不同UserHostName的緩存,由于程序在執行過程中,首先調用全局方法GetVaryByCustomString()來確定是否緩存頁面或重用現有的,所以我們可以通過重寫GetVaryByCustomString()方法實現基于UserHostName的緩存,首先我們創建一個Global.asax文件然后重新全局方法GetVaryByCustomString()具體實現如下:

public override string GetVaryByCustomString(HttpContext context, string custom)

{

??? if (string.Equals(custom, "UserHostName", StringComparison.OrdinalIgnoreCase))

??? {

?????? ?// Indicates that the cache should be vary on user host name.

??????? return Context.Request.UserHostName;

??? }

??? return base.GetVaryByCustomString(context, custom);

}

前面我們重寫了GetVaryByCustomString()方法,使得UserHostName值不同時,獲取相應的緩存值。

然后讓程序基于UserHostName創建緩存,所以我們要在頁面添加以下代碼:

<%@ OutputCache Duration="30" VaryByParam="None" VaryByCustom="UserHostName" %>

我們通過自定義現在GetVaryByCustomString()方法,實現了Web程序根據UserHostName實施不同的緩存方式,其實,我們還可以實現更多種類緩存方案,例如:基于用戶角色、時間和Url等等。

片段緩存

為了實現片段緩存,我們需要創建自定義控件緩存部分頁面,然后我們把OutputCache指令添加到自定義控件中,這樣整個頁面將不會被緩存,而自定義緩存控件除外。

數據緩存

Cache對象是線程安全:這表示無需顯式實現鎖定或解鎖,在添刪Cache對象中的元素,然而,在Cache對象中元素必須是線程安全的。例如,我們創建一個實體Product,而且存在多個客戶端可能同時操作該對象的情況,這時我們必須為實體Product實現鎖定和解鎖操作(同步操作請參考《單例模式(Singleton)的6種實現》)。

Cache對象中的緩存項自動移除:當緩存過期,依賴項被修改或內存不足緩存ASP.NET會自動移除該緩存項。

緩存項支持依賴關系:我們可以給緩存項添加文件、數據庫表或其他資源類型的依賴關系。

緩存的依賴關系

緩存項之間的依賴

ASP.NET Cache允許我們建立緩存之間的依賴關系,即一個緩存項依賴于另一個緩存項;以下示例代碼創建了二個緩存項,并且它們之間建立依賴關系。具體實現如下:

// Creates cache object Key1.

Cache["Key1"] = "Cache Item 1";

?

// Makes Cache["Key2"] dependent on Cache["Key1"].

string[] dependencyKey = new string[1];

dependencyKey[0] = "Key1";

?

// Creates a CacheDependency object.

CacheDependency dependency = new CacheDependency(null, dependencyKey);

?

// Establishs dependency between cache Key1 and Key2.

Cache.Insert("Key2", "Cache Item 2", dependency);

現在,當Key1緩存項更新或從緩存中刪除,Key2緩存項就會自動從緩存刪除。

文件依賴

前面我們介紹了緩存項之間的依賴關系,ASP.NET Cache還提供緩存項與文件之間的依賴關系,當文件被更新或刪除對應的緩存項也將失效

?

轉載于:https://www.cnblogs.com/sylone/p/7347286.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252118.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252118.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252118.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

thinkphp5.0學習(九):TP5.0視圖和模板

原文地址&#xff1a;http://blog.csdn.net/fight_tianer/article/details/78602711 一、視圖 1.加載頁面 1.繼承系統控制器類return $this->fetch(參數1&#xff0c;參數2&#xff0c;參數3&#xff0c;參數4);參數1&#xff08;字符串&#xff09;&#xff1a;模板渲染參數…

C#中調用halcon引擎來執行hdev程序

調用halcon引擎有兩個直接的好處&#xff1a; 避免C# 與halcon代碼混編時可能產生的內存泄露問題 修改halcon程序時不用重新編譯C# 勇哥寫了一個示例&#xff0c;詳細的應用感受和缺點限制勇哥會持續做相關的總結給大家分享。 對于halcon17來說&#xff0c;要運行下面的程序…

Node.js Up and Runing 學習日記(八)

目錄 連接池基于一個簡單的Socker.io服務器連接池 生產環境通常由多種資源組成: web服務器,緩存服務器和數據庫服務器. 數據庫服務器通常部署在web服務器之外的獨立機器上,這使得面向公眾的網站不必重新配置和修改復雜的數據庫群就可以垂直增長了. 基于 為每一個請求創建一個甚…

036有效的數獨

1 #include "000庫函數.h"2 3 //一看&#xff0c;沒想出什么好法子&#xff0c;就遍歷了4 //最重要的是如何比較小九宮格的數據5 //44ms6 class Solution {7 public:8 bool isValidSudoku(vector<vector<char>>& board) {9 for (int i …

WinAPI——Windows 消息

消息值 注釋 WM_NULL$0000 WM_CREATE$0001 WM_DESTROY$0002 WM_MOVE$0003 WM_SIZE$0005 WM_ACTIVATE$0006 WM_SETFOCUS$0007 WM_KILLFOCUS$0008 WM_ENABLE$000A WM_SETREDRAW$000B WM_SETTEXT$000C WM_GETTEXT$000D WM_GETTEXTLENGTH$000E WM_PAINT$000F WM_CLOSE$0010 WM_QUER…

AciveMQ小結|最后有視頻

1 JMS 在介紹ActiveMQ之前&#xff0c;首先簡要介紹一下JMS規范。 1.1 JMS的基本構件 1&#xff0e;1&#xff0e;1 連接工廠 連接工廠是客戶用來創建連接的對象&#xff0c;例如ActiveMQ提供的ActiveMQConnectionFactory。 1&#xff0e;1&#xff0e;2 連接 JMS Connection封…

Build 2016: 發布明天的云創新來服務今天的開發者

每個企業和行業都在被云潛移默化地改變著。隨著云計算的速度、規模和靈活性的不斷增加&#xff0c;云服務帶來的可能性也在不斷被拓展。想象一下&#xff0c;通過監測傳感器&#xff0c;一位奶農能夠將他的奶牛牛奶產量提高&#xff1b;或是一家醫院能夠自動監測環境衛生狀況&a…

禁用JavaScript之后,你的網站表現如何?

禁用JavaScript之后&#xff0c;你的網站表現如何&#xff1f;一最近要做一個新官網&#xff0c;需求評審完之后&#xff0c;考慮到官網都是純靜態頁面&#xff0c;功能簡單&#xff0c;操起vue-cli3幾秒內創建好了項目腳手架&#xff0c;開發前&#xff0c;我打開了首頁模板文…

C# 使用 Windows API 操作控件: SendMessage

在C#中&#xff0c;程序采用了的驅動采用了事件驅動而不是原來的消息驅動&#xff0c;雖然.net框架提供的事件已經十分豐富&#xff0c;但是在以前的系統中定義了豐富的消息對系統的編程提供了方便的實現方法&#xff0c;因此在C#中使用消息有時候還是大大提高編程的效率的。定…

對類的理解:

在public class First 表示如果一個類的聲明為public&#xff0c;要求該類的類名必須和文件保持一致。在編譯 源文件時&#xff0c;讓雨果源文件中定義了多個類&#xff0c;那么每個類會形成*.class 文件&#xff0c;執行是&#xff0c;通過Java類名&#xff0c;運行的的是該類…

概率論

概率論轉載于:https://www.cnblogs.com/zengkefu/p/7357249.html

Hive安裝中遇到過的坑

實現說明每一個用戶的環境都有細微的不一致&#xff0c;所以這里只是個人經過這些坑的處理&#xff0c;但是不意味著所有處理都是這樣的操作&#xff0c;僅作為參考。 第一個坑 數據庫安裝&#xff0c;數據庫最好裝在Linux上&#xff0c;一直出了很多錯&#xff0c;這里有一個博…

Halcon:模版匹配

一&#xff1a;函數介紹 1.創建模板 create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID) Template &#xff1a;模板圖像 NumLevels&#xff1a;圖像金字塔級數&#xff0c;該值越小…

java基礎英語---第二十六天

Terminate [ t?:mineit ] 結束 Instantiation [in,stn?iei??n] 實例化 Instance declared [diklε?d] 公然的 Access [ ?kses ] 進入,接近,入口,通道 Accessible [?kses?bl] 可進入的 invoke [inv?uk] 調用 board [b?:d] 木板,甲板 MainBoard card [kɑ:d] …

ASP.NET Core部署到Linux服務器(CentOS7 x64)

前言 本文主要講解如何一步步將ASP.NET Core網站發布到Linux服務器&#xff0c;文中會講解具體步驟及需要避免的各種問題。 目錄 一、環境介紹 二、創建及發布ASP.NET Core網站項目 三、服務器軟件安裝&#xff08;.NET Core SDK&#xff09; 四、在服務器上部署ASP.NET Core網…

redux進一步優化

1. 將原來的 mapStateToDispatch 中的函數提取出來&#xff0c;放在組件中&#xff0c; 如原來的&#xff1a; function mapStateToProps(state, ownProps) {return {hasMore:state.getIn([tabs,hasMore]),} } function mapDispatchToProps(dispatch) {return {addTabList:(i…

C# : 調用C++動態庫(dll)

在實際軟件開發過程中&#xff0c;由于公司使用了多種語言開發&#xff0c;在C#中可能需要實現某個功能&#xff0c;而該功能可能用其他語言已經實現了&#xff0c;那么我們可以調用其他語言寫好的模塊嗎&#xff1f;還有就是&#xff0c;由于C#開發好的項目&#xff0c;我們可…

Python3.5以上版本lxml導入etree報錯Unresolved reference

Web抓取Web站點使用HTML描述&#xff0c;這意味著每個web頁面是一個結構化的文檔。有時從中 獲取數據同時保持它的結構是有用的。web站點不總是以容易處理的格式&#xff0c; 如 csv 或者 json 提供它們的數據。 這正是web抓取出場的時機。Web抓取是使用計算機程序將web頁面數據…

linux設置history歷史記錄

#說明export HISTSIZE1000 #設置歷史記錄顯示1000行export HISTTIMEFORMAT%F %T #設置歷史記錄格式 999 2017-08-15 10:58:32 #修改vim /etc/profilesed -i "s/\(HISTSIZE\).*/\11000/" /etc/profilesed -i "/HISTSIZE/aexport HISTTIMEFORMAT%F %T " /et…

STL-容器庫101--array【C11】

1. 原型 C11提供 template < class T, size_t N > class array;T&#xff1a; 元素類型&#xff0c;以 array::value_type 作為別名使用&#xff1b;N&#xff1a; array中元素大小&#xff1b; 固定size的序列容器&#xff1b;初始化時&#xff0c; array對象不保存任何…