国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
.net緩存技術(shù)詳解

動態(tài)緩存(1)-傳統(tǒng)緩存 與 頁面輸出緩存

面詳細(xì)介紹在《系統(tǒng)緩存全解析一》中提及的動態(tài)緩存技術(shù):

一,傳統(tǒng)緩存方式:

比如將可重復(fù)利用的東西放到Application或是Session中去保存。

Session["Style"] = val;
Application["Count"] = 0;

二,頁面輸出緩存:全頁緩存到服務(wù)器內(nèi)存中

     頁面輸出緩存是最為簡單的緩存機(jī)制,該機(jī)制將整個ASP.NET頁面內(nèi)容保存在服務(wù)器內(nèi)存中。當(dāng)用戶請求該頁面時,系統(tǒng)從內(nèi)存中輸出相關(guān)數(shù)據(jù),直到緩存數(shù)據(jù)過期。在這個過程中,緩存內(nèi)容直接發(fā)送給用戶,而不必再次經(jīng)過頁面處理生命周期。通常情況下,頁面輸出緩存對于那些包含不需要經(jīng)常修改內(nèi)容的,但需要大量處理才能編譯完成的頁面特別有用。需要讀者注意的是,頁面輸出緩存是將頁面全部內(nèi)容都保存在內(nèi)存中,并用于完成客戶端請求。

在ASP.NET中頁面緩存的使用方法非常的簡單,只需要在aspx頁的頂部加這樣一句聲明即可:

<%@ OutputCache Duration="60" VaryByParam="none" %>

Duration

緩存的時間(秒)。這是必選屬性。如果未包含該屬性,將出現(xiàn)分析器錯誤。



<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="CacheWebApp._16_4_3.WebForm1" %>

<%@ OutputCache Duration="60" VaryByParam="none" %>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

<title>頁面緩存示例</title>

</head>

<body>

<form id="form1" runat="server">

<div>

<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

</div>

</form>

</body>

</html>


后臺代碼:

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{
Label1.Text = DateTime.Now.ToString();

}

}



如果不加<%@ OutputCache Duration="60" VaryByParam="none" %>,每次刷新頁面上的時間每次都是在變。而加了緩存聲明以后,每次刷新頁面的時間并不變化,60秒后才變化一次,說明數(shù)據(jù)被緩存了60秒。



VaryByParam

是指頁面根據(jù)使用 POST 或 GET 發(fā)送的名稱/值對(參數(shù))來更新緩存的內(nèi)容,多個參數(shù)用分號隔開。如果不希望根據(jù)任何參數(shù)來改變緩存內(nèi)容,請將值設(shè)置為 none。如果希望通過所有的參數(shù)值改變都更新緩存,請將屬性設(shè)置為星號 (*)。

例如: http://localhost:1165/16-4-3/WebForm1.aspx?p=1
則可以在WebForm1.aspx頁面頭部聲明緩存:<%@ OutputCache Duration="60" VaryByParam="p" %>

以上代碼設(shè)置頁面緩存時間是60秒,并根據(jù)p參數(shù)的值來更新緩存,即p的值發(fā)生變化才更新緩存。

如果一直是WebForm1.aspx?p=1訪問該頁,則頁面會緩存當(dāng)前數(shù)據(jù),當(dāng)p=2時又會執(zhí)行后臺代碼更新緩存內(nèi)容。



如果有多個參數(shù)時,如:http://localhost:1165/16-4-3/WebForm1.aspx?p=1&n=1

可以這樣聲明:<%@ OutputCache Duration="60" VaryByParam="p;n" %>



除此之外,@OutputCache 還有一些其他的屬性。@OutputCache指令中的屬性參數(shù)描述如下:

<%@ OutputCache Duration="#ofseconds"

Location="Any | Client | Downstream | Server | None |

ServerAndClient "

Shared="True | False"

VaryByControl="controlname"

VaryByCustom="browser | customstring"

VaryByHeader="headers"

VaryByParam="parametername"

CacheProfile="cache profile name | ''"

NoStore="true | false"

SqlDependency="database/table name pair | CommandNotification"

%>


CacheProfile

用于調(diào)用Web.config配置文件中設(shè)置的緩存時間。這是可選屬性,默認(rèn)值為空字符 ("")。

例如:


 

 

 

在Web.config中加入配置:

<system.web>

<caching>

    <outputCacheSettings>

        <outputCacheProfiles>

           <add name="CacheTest" duration="50" />

        </outputCacheProfiles>

     </outputCacheSettings>

</caching>

</system.web>


頁面中聲明:

<%@ OutputCache CacheProfile="CacheTest" VaryByParam="none" %>




注意:

包含在用戶控件(.ascx 文件)中的 @ OutputCache 指令不支持此屬性。在頁中指定此屬性時,屬性值必須與 outputCacheSettings 節(jié)下面的 outputCacheProfiles 元素中的一個可用項的名稱匹配。如果此名稱與配置文件項不匹配,將引發(fā)異常。



如果每個頁面的緩存時間相同,則不需要每個頁面設(shè)置,而是通過統(tǒng)一一個地方控制,這樣就可以更好的統(tǒng)一控制所有頁面的緩存時間。如果想改變緩存時間,只需要改一下web.config的配置信息即可,而不用每個頁面去修改。


VaryByControl

通過用戶控件文件中包含的服務(wù)器控件來改變緩存(值是控件ID,多控件用分號隔開)。

在 ASP.NET 頁和用戶控件上使用 @ OutputCache 指令時,需要該屬性或 VaryByParam 屬性。



<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="CacheWebApp._16_4_3.WebForm2" %>

<%@ OutputCache Duration="60" VaryByParam="none" VaryByControl="DropDownList1" %>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

<title>根據(jù)控件頁面緩存</title>

</head>

<body>

<form id="form1" runat="server">

<div>

<%=DateTime.Now %>

<br>

<asp:DropDownList ID="DropDownList1" runat="server">

<asp:ListItem>beijing</asp:ListItem>

<asp:ListItem>shanghai</asp:ListItem>

<asp:ListItem>guangzhou</asp:ListItem>

</asp:DropDownList>

<asp:Button ID="Button1" runat="server" Text="提交" />

</div>

</form>

</body>

</html>


以上代碼設(shè)置緩存有效期是60秒,并且頁面不隨任何GET或POST參數(shù)改變(即使不使用VaryByParam屬性,但是仍然需要在@ OutputControl指令中顯式聲明該屬性)。如果用戶控件中包含ID屬性為“DropDownList1”的服務(wù)器控件(例如下拉框控件),那么緩存將根據(jù)該控件的變化來更新頁面數(shù)據(jù)。

此外介紹一下頁面頁面輸出緩存的API:程序人員可以通過調(diào)用API將Response內(nèi)容存放到Web服務(wù)器的Cache中:

Response類的Cache屬性用于獲取頁面緩存策略。該方式的核心是調(diào)用System.Web.HttpCachePolicy。該類主要包含用于設(shè)置緩存特定的HTTP標(biāo)頭的方法和用于控制ASP.NET頁面輸出緩存的方法。與.NET Framework 1.x中的HttpCachePolicy類相比,.NET Framework 2.0中的HttpCachePolicy類得到了擴(kuò)充和發(fā)展。主要是增加了一些重要方法,例如,SetOmitVarStar方法等。由于HttpCachePolicy類方法眾多,下面簡要說明幾個常用方法。

SetExpires方法

用于設(shè)置緩存過期的絕對時間。它的參數(shù)是一個DataTime類的實例,表示過期的絕對時間。



protected void Page_Load(object sender, EventArgs e)

{

// 通過API設(shè)置緩存

//相當(dāng)于@OutputCache指令中的Duration屬性

Response.Cache.SetExpires(DateTime.Now.AddSeconds(10));

Response.Cache.SetExpires(DateTime.Parse("6:00:00PM"));

}


如上代碼,第一行代碼表示輸出緩存時間是60秒,并且頁面不隨任何GET或POST參數(shù)改變,等同于“<%@ OutputCache Duration="60" VaryByParam="none" %>”。第二行代碼設(shè)置緩存過期的絕對時間是當(dāng)日下午6時整。


SetLastModified方法

用于設(shè)置頁面的Last-Modified HTTP標(biāo)頭。Last-Modified HTTP標(biāo)頭表示頁面上次修改時間,緩存將依靠它來進(jìn)行計時。如果違反了緩存限制層次結(jié)構(gòu),此方法將失敗。該方法的參數(shù)是一個DataTime類的實例。


SetSlidingExpiration方法

該方法將緩存過期從絕對時間設(shè)置為可調(diào)時間。其參數(shù)是一個布爾值。當(dāng)參數(shù)為true時,Cache-Control HTTP標(biāo)頭將隨每個響應(yīng)而更新。此過期模式與相對于當(dāng)前時間將過期標(biāo)頭添加到所有輸出集的IIS配置選項相同。當(dāng)參數(shù)為False時,將保留該設(shè)置,且任何啟用可調(diào)整過期的嘗試都將靜態(tài)失敗。此方法不直接映射到HTTP標(biāo)頭。它由后續(xù)模塊或輔助請求來設(shè)置源服務(wù)器緩存策略。


SetOmitVaryStar方法

ASP.NET 2.0新增的方法。用于指定在按參數(shù)進(jìn)行區(qū)分時,響應(yīng)是否應(yīng)該包含vary:*標(biāo)頭。方法參數(shù)是一個布爾值,若要指示HttpCachePolicy不對其VaryByHeaders屬性使用*值,則為true;否則為false。


SetCacheability方法

用于設(shè)置頁面的Cache-Control HTTP標(biāo)頭。該標(biāo)頭用于控制在網(wǎng)絡(luò)上緩存文檔的方式。該方法有兩種重載方式,所不同的是參數(shù)。一種重載方法的參數(shù)是HttpCacheability枚舉值,包括NoCache、Private、Public、Server、ServerAndNoCache和ServerAndPrivate(有關(guān)這些枚舉值的定義,可參考MSDN)。另一種方法的參數(shù)有兩個,一個參數(shù)是HttpCacheability枚舉值,另一個參數(shù)是字符串,表示添加到標(biāo)頭的緩存控制擴(kuò)展。需要注意的是,僅當(dāng)與Private或NoCache指令一起使用時,字段擴(kuò)展名才有效。如果組合不兼容的指令和擴(kuò)展,則此方法將引發(fā)無效參數(shù)異常。

 

 系統(tǒng)緩存全解析二:動態(tài)緩存(2)-頁面局部緩存的兩種方式

有時緩存整個頁面是不現(xiàn)實的,因為頁的某些部分可能在每次請求時都需要變化。在這些情況下,只能緩存頁的一部分。顧名思義,頁面部分緩存是將頁面部分內(nèi)容保存在內(nèi)存中以便響應(yīng)用戶請求,而頁面其他部分內(nèi)容則為動態(tài)內(nèi)容。頁面部分緩存的實現(xiàn)包括兩種方式:

    控件緩存(通過使用控件嵌套的方式來實現(xiàn)緩存部分頁面) 。

    替換后緩存(通過緩存整個頁面,替換部分頁面組件的方式來實現(xiàn)部分緩存)。

1. 控件緩存(也稱為片段緩存):

這種方式允許將需要緩存的信息包含在一個用戶控件內(nèi),然后,將該用戶控件標(biāo)記為可緩存的,以此來緩存頁面輸出的部分內(nèi)容。該選項允許緩存頁面中的特定內(nèi)容,而沒有緩存整個頁面,因此,每次都需重新創(chuàng)建整個頁。例如,如果要創(chuàng)建一個顯示大量動態(tài)內(nèi)容(如股票信息)的頁,其中有些部分為靜態(tài)內(nèi)容(如每周總結(jié)),這時可以將靜態(tài)部分放在用戶控件中,并允許緩存這些內(nèi)容。

在ASP.NET中,提供了UserControl這種用戶控件的功能。一個頁面可以通過多個UserControl來組成。只需要在某個或某幾個UserControl里設(shè)置緩存。

例如:

那么可以在WebUserControl1.ascx的頁頭代碼中添加聲明語句:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" Inherits="CacheWebApp._16_4_5.WebUserControl1" %>

<%@ OutputCache Duration="60" VaryByParam="none" %>

<%=DateTime.Now %>


調(diào)用該控件的頁面WebForm1.aspx代碼:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="CacheWebApp._16_4_5.WebForm1" %>

<%@ Register src="WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1" %>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

<title>控件緩存</title>

</head>

<body>

<form id="form1" runat="server">

<div>

頁面的:<%=DateTime.Now %>

</div>

<div>

控件的:<uc1:WebUserControl1 ID="WebUserControl11" runat="server" />

</div>

</form>

</body>

</html>


這時候刷新WebForm1.aspx頁面時,頁面的時間每次刷新都變化,而用戶控件中的時間數(shù)據(jù)卻是60秒才變化一次,說明對頁面的“局部”控件實現(xiàn)了緩存,而整個頁面不受影響。

-------------------------------------------------------------------------------------------------------

2. 緩存后替換:

與控件緩存正好相反。它對整個頁面進(jìn)行緩存,但是頁中的某些片段是動態(tài)的,因此不會緩存這些片段。ASP.NET頁面中既包含靜態(tài)內(nèi)容,又包含基于數(shù)據(jù)庫數(shù)據(jù)的動態(tài)內(nèi)容。靜態(tài)內(nèi)容通常不會發(fā)生變化。因此,對靜態(tài)內(nèi)容實現(xiàn)數(shù)據(jù)緩存是非常必要的。然而,那些基于數(shù)據(jù)的動態(tài)內(nèi)容,則不同。數(shù)據(jù)庫中的數(shù)據(jù)可能每時每刻都發(fā)生變化,因此,如果對動態(tài)內(nèi)容也實現(xiàn)緩存,可能造成數(shù)據(jù)不能及時更新的問題。對此問題如果使用前文所述的控件緩存方法,顯然不切實際,而且實現(xiàn)起來很繁瑣,易于發(fā)生錯誤。

如何實現(xiàn)緩存頁面的大部分內(nèi)容,而不緩存頁面中的局部某些片段。ASP.NET 2.0提供了緩存后替換功能。實現(xiàn)該項功能可通過以下三種方法:

一是以聲明方式使用Substitution控件,

二是以編程方式使用Substitution控件API,

三是以隱式方式使用控件。

前兩種方法的核心是Substitution控件,本節(jié)將重點介紹該控件,第三種方法僅專注于控件內(nèi)置支持的緩存后替換功能,本節(jié)僅做簡要說明。



(1) Substitution控件應(yīng)用

為提高應(yīng)用程序性能,可能會緩存整個ASP.NET頁面,同時,可能需要根據(jù)每個請求來更新頁面上特定的部分。例如,可能要緩存頁面的很大一部分,需要動態(tài)更新該頁上與時間或者用戶高度相關(guān)的信息。在這種情況下,推薦使用Substitution控件。Substitution控件能夠指定頁面輸出緩存中需要以動態(tài)內(nèi)容替換該控件的部分,即允許對整頁面進(jìn)行輸出緩存,然后,使用Substitution控件指定頁中免于緩存的部分。需要緩存的區(qū)域只執(zhí)行一次,然后從緩存讀取,直至該緩存項到期或被清除。動態(tài)區(qū)域,也就是Substitution控件指定的部分,在每次請求頁面時都執(zhí)行。Substitution控件提供了一種緩存部分頁面的簡化解決方案。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="CacheWebApp._16_4_5.WebForm2" %>

<%@ OutputCache Duration="60" VaryByParam="none" %>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

<title>緩存后替換示例</title>

</head>

<body>

<form id="form1" runat="server">

<div>

頁面緩存的時間:<%= DateTime.Now.ToString() %>

</div>

<div>

真實(替換)的時間:<asp:Substitution ID="Substitution1" runat="server" MethodName="getCurrentTime" />

</div>

</form>

</body>

</html>
頁面后臺代碼:

public partial class WebForm2 : System.Web.UI.Page

{

public static string getCurrentTime(HttpContext context)

{

return DateTime.Now.ToString();

}

}
如上代碼所示,Substitution控件有一個重要屬性:MethodName。該屬性用于獲取或者設(shè)置當(dāng)Substitution控件執(zhí)行時為回調(diào)而調(diào)用的方法名稱。該方法比較特殊,必須符合以下3條標(biāo)準(zhǔn):

Ø 此方法必須被定義為靜態(tài)方法;

Ø 此方法必須接受HttpContext類型的參數(shù);

Ø 此方法必須返回String類型的值。



在運行情況下,Substitution控件將自動調(diào)用MethodName屬性所定義的方法。該方法返回的字符串即為要在頁面中的Substitution控件的位置上顯示的內(nèi)容。如果頁面設(shè)置了緩存全部輸出,那么在第一次請求時,該頁將運行并緩存其輸出。對于后續(xù)的請求,將通過緩存來完成,該頁上的其他代碼不會再運行。但Substitution控件及其有關(guān)方法則在每次請求時都執(zhí)行,并且自動更新該控件所表示的動態(tài)內(nèi)容,這樣就實現(xiàn)了整體緩存,局部變化的替換效果。



如上代碼所示,在代碼頭部通過@ OutputCache指令設(shè)置頁面輸出緩存過期時間為5秒,這意味著整個頁面數(shù)據(jù)都應(yīng)用了緩存功能。因此,“頁面緩存的時間”所顯示的時間值來自于數(shù)據(jù)緩存。這個時間值不會隨著刷新頁面而變化,僅當(dāng)緩存過期時才會發(fā)生更新。Substitution控件的MethodName屬性值為getCurrentTime。該控件顯示的內(nèi)容來自于getCurrentTime方法的返回值。尤為重要的是,雖然頁面設(shè)置了輸出緩存功能,但是每當(dāng)頁面刷新時,ASP.NET執(zhí)行引擎仍然要重新執(zhí)行Substitution控件,并將MethodName屬性值指定的方法返回值顯示在頁面上,因此,顯示的是當(dāng)前最新時間。

示例效果,如圖15-2所示:



圖15-2 緩存后替換

隨著頁面的刷新,真實時間在變,而頁面緩存的時間在指定的緩存時間內(nèi)始終不變。




注意:

l Substitution控件無法訪問頁上的其他控件,也就是說,無法檢查或更改其他控件的值。但是,代碼確實可以使用傳遞給它的參數(shù)來訪問當(dāng)前頁上下文。

l 在緩存頁包含的用戶控件中可以包含Substitution控件。但是,在輸出緩存用戶控件中不能放置Substitution控件。

l Substitution控件不會呈現(xiàn)任何標(biāo)記,其位置所顯示內(nèi)容完全取決于所定義方法的返回字符串。




(2) Substitution控件API應(yīng)用

上一小節(jié)介紹了以聲明方式使用Substitution控件實現(xiàn)緩存后替換的應(yīng)用。本節(jié)說明另一種實現(xiàn)方法。該方法的核心是以編程方式利用Substitution控件API實現(xiàn)緩存后替換,相對于以聲明方式使用Substitution控件的方法具有更強(qiáng)靈活性。

通過為Substitution指定回調(diào)方法,實現(xiàn)和聲明同樣的效果。Substitution的回調(diào)方法必須是

HttpResponseSubstitutionCallback委托定義的方法,它有兩個特征:

l 一是返回值必須是String,

l 二是參數(shù)有且僅有一個,并且是HttpContext類型。

當(dāng)需要以編程方式,為緩存的輸出響應(yīng)動態(tài)生成指定的響應(yīng)區(qū)域時,可以在頁面代碼中將某個方法(即回調(diào)方法)的名稱作為參數(shù)(HttpResponseSubstitutionCallback)傳遞給Substitution。這樣Substitution就能夠使用回調(diào)方法,并將回調(diào)方法的返回值作為給定位置的替代內(nèi)容顯示出來。

需要注意的是,回調(diào)方法必須是線程安全的,可以是作為容器的頁面或者用戶控件中的靜態(tài)方法,也可以是其他任意對象上的靜態(tài)方法或?qū)嵗椒ā?br>


下面演示一個以編程方式將 Substitution 控件添加到輸出緩存網(wǎng)頁。與(1)Substitution控件應(yīng)用所示的示例完成同樣功能。不同的是實現(xiàn)方式。



<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm3.aspx.cs" Inherits="CacheWebApp._16_4_5.WebForm3" %>

<%@ OutputCache Duration="60" VaryByParam="none" %>

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

<title>緩存后替換-Substitution控件API應(yīng)用</title>

</head>

<body>

<form id="form1" runat="server">

<div>

頁面緩存的時間:<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

</div>

<div>

真實(緩存替換)的時間:

<asp:PlaceHolder ID="PlaceHolder1" runat="Server"></asp:PlaceHolder>

</div>

</form>

</body>

</html>




頁面后臺CS代碼:

protected void Page_Load(object sender, EventArgs e)

{

//創(chuàng)建一個Substitution

Substitution Substitution1 = new Substitution();

//指定調(diào)用的回調(diào)方法名

Substitution1.MethodName = "GetCurrentDateTime";

PlaceHolder1.Controls.Add(Substitution1);



Label1.Text=DateTime.Now.ToString();

}

public static string GetCurrentDateTime(HttpContext context)

{

return DateTime.Now.ToString();

}
如上代碼所示,頁面使用@ OutputCache指令設(shè)置了輸出緩存功能,其配置數(shù)據(jù)緩存過期時間為60秒。然而,頁面其他內(nèi)容都被緩存,通過Substitution調(diào)用的回調(diào)方法顯示的內(nèi)容是不被緩存的。

 

系統(tǒng)緩存全解析二:動態(tài)緩存(3)-文件,對象緩存依賴與數(shù)據(jù)庫緩存依賴

(依據(jù)文件,數(shù)據(jù)庫,表等變化而自動更新緩存內(nèi)容)

一,緩存文件:

       簡單語言介紹以下,將硬盤中的文本文件緩存至web服務(wù)器內(nèi)存中,一般常用在緩存配置文件或其他公共文件上,并自動監(jiān)聽文件是否有被修改,一旦被修改,將自動的更新緩存。因為與下面的數(shù)據(jù)庫緩存依賴基本代碼一致,所以不加代碼示例。

二,緩存非序列化對象或者序列化對象:

不用多說,就是將對象放入緩存內(nèi)啦。

三,數(shù)據(jù)庫緩存依賴項:

為了實現(xiàn).NET緩存依賴需要調(diào)用System.Web.Caching下的三個類:

1,Cache類 ;//將數(shù)據(jù)緩存到該對象內(nèi);

2,SqlCacheDependency類;//主要負(fù)責(zé)為Cache對象 與 數(shù)據(jù)庫表或結(jié)果集合建立關(guān)系的類

3,SqlCacheDependencyAdmin類;//可忽略不用,以后總結(jié)

以及System.Data.SqlClient下的兩個類:

1,System.Data.SqlClient.SqlDependency   //開啟或關(guān)閉對于數(shù)據(jù)庫的監(jiān)聽

以及開啟MSSQL內(nèi)某一數(shù)據(jù)庫的消息傳遞服務(wù):

           alter database Common set enable_broker   //開啟

           alter database Common set disable_broker //關(guān)閉

下面是詳細(xì)的。NET針對MSSQL緩存依賴項的例程:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Caching;
using System.Collections;
using System.Data.SqlClient;
using System.Data;
using System.Xml;
using System.Collections.ObjectModel;
using System.Web;

namespace HOSoft.Herp4.AutoTest.Common.Data
{
    public sealed class CacheProvider<T>
    {
        #region 全局變量
        public static Cache HerpCache = HttpRuntime.Cache;
        public static CacheItemRemovedCallback Callback = new CacheItemRemovedCallback(CacheProvider<T>.RemovedItemCallBack);
        public static TimeSpan timespan;
        #endregion
       
        //#region 靜態(tài)構(gòu)造函數(shù)
        //static CacheProvider()
        //{
        //    HerpCache = new Cache();
        //}
        //#endregion


        public static void StartSqlDependency(Collection<string> StrConnection)
        {
           
            if (StrConnection.Count > 0)
            {
                foreach (string str in StrConnection)
                {
                    SqlDependency.Start(str);
                }
            }
        }


        public static void StopSqlDependency(Collection<string> StrConnection)
        {
            if (StrConnection.Count > 0)
            {
                foreach (string str in StrConnection)
                {
                    SqlDependency.Stop(str);
                }
               
            }
        }


        public static SqlCacheDependency CreateSqlCacheDependency(SqlCommand Sqlcommand)
        {
            if (Sqlcommand.GetHashCode() != 0)
            {
                SqlCacheDependency SCacheDependency = new SqlCacheDependency(Sqlcommand);
                return SCacheDependency;
            }
            else
            {
                return null;
            }
        }

        public static bool AddItemInCache(string DataName, T DataValue, SqlCommand Command,String DataBase_Name)
        {
            if (!string.IsNullOrEmpty(DataName) && DataValue.GetHashCode() != 0)
            {
                if (HerpCache[DataName] == null)
                {
                    switch (DataBase_Name.Trim().ToLower())
                    {
                        case "common": timespan = new TimeSpan(24, 0, 0);
                            break;

                        case "house":timespan = new TimeSpan(24, 0, 0);
                            break;

                        case "oa":timespan = new TimeSpan(12, 0, 0);
                            break;

                        case "report":timespan = new TimeSpan(24, 0, 0);
                            break;
                        default: timespan = new TimeSpan(6, 0, 0);
                            break;

                    }
                    HerpCache.Add(DataName, DataValue, CreateSqlCacheDependency(Command), Cache.NoAbsoluteExpiration, timespan, CacheItemPriority.High, Callback);

                    return true;
                }
                else
                return false;
            }
            else
            return false;
        }

        public static bool RemoveItemFromCache(string DataName)
        {
            if (string.IsNullOrEmpty(DataName))
            {
                if (HerpCache[DataName] != null)
                {
                    HerpCache.Remove(DataName);
                    return true;

                }
                else return false;
            }
            return false;
        }

        public static void RemovedItemCallBack(string key,Object value,CacheItemRemovedReason reason)
        {
        }

    }
}

Memcached — 分布式緩存系統(tǒng)

1.Memcached是什么?

Memcached是高性能的,分布式的內(nèi)存對象緩存系統(tǒng),用于在動態(tài)應(yīng)用中減少數(shù)據(jù)庫負(fù)載,提升訪問速度。Memcached通過在內(nèi)存里維護(hù)一個統(tǒng)一的巨大的hash表,它能夠用來存儲各種格式的數(shù)據(jù),包括圖像、視頻、文件以及數(shù)據(jù)庫檢索的結(jié)果等。Memcached由Danga Interactive最初為了加速 LiveJournal網(wǎng)站訪問速度而開發(fā)的,后來被很多大型的網(wǎng)站采用。起初作者編寫它可能是為了提高動態(tài)網(wǎng)頁應(yīng)用,為了減輕數(shù)據(jù)庫檢索的壓力,來做的這個緩存系統(tǒng)。它的緩存是一種分布式的,也就是可以允許不同主機(jī)上的多個用戶同時訪問這個緩存系統(tǒng),這種方法不僅解決了共享內(nèi)存只能是單機(jī)的弊端,同時也解決了數(shù)據(jù)庫檢索的壓力,最大的優(yōu)點是提高了訪問獲取數(shù)據(jù)的速度!基于memcached作者對分布式cache的理解和解決方案。memcached完全可以用到其他地方比如分布式數(shù)據(jù)庫,分布式計算等領(lǐng)域。Memcached將數(shù)據(jù)庫負(fù)載大幅度降低,更好的分配資源,更快速訪問。

2.Memcached工作機(jī)制

通過在內(nèi)存中開辟一塊區(qū)域來維持一個大的hash表來加快頁面訪問速度,和數(shù)據(jù)庫是獨立的。但是目前主要用來緩存數(shù)據(jù)庫的數(shù)據(jù)。允許多個server通過網(wǎng)絡(luò)形成一個大的hash,用戶不必關(guān)心數(shù)據(jù)存放在哪,只調(diào)用相關(guān)接口就可。存放在內(nèi)存的數(shù)據(jù)通過LRU算法進(jìn)行淘汰出內(nèi)存。同時可以通過刪除和設(shè)置失效時間來淘汰存放在內(nèi)存的數(shù)據(jù)。

現(xiàn)在一些.NET開發(fā)人員開始放棄ASP.NET內(nèi)置的緩存機(jī)制,轉(zhuǎn)而使用Memcached——一種分布式的內(nèi)存緩存系統(tǒng)。當(dāng)運行在單獨的Web服務(wù)器上,你可以很容易地清除一個已經(jīng)確認(rèn)被改變了的緩存??上?,ASP.NET沒有一個很好的方法來支持多服務(wù)器。每個服務(wù)器上的緩存都對其他緩存的改變一無所知。

ASP.NET允許通過基于文件系統(tǒng)和數(shù)據(jù)庫表的觸發(fā)器來作廢一個緩存。然而,這也存在問題,比如數(shù)據(jù)庫觸發(fā)器需要使用昂貴的輪詢,以及觸發(fā)器本身冗長的編程。但是,我們還是有其他的選擇的。

不像ASP.NET內(nèi)置的緩存機(jī)制,Memcached是一個分布式的緩存系統(tǒng)。任何Web服務(wù)器都能更新或刪除一個緩存項,并且所有其他的服務(wù)器都能在下次訪問這些緩存項的時候自動獲取到更新的內(nèi)容。這是通過把這些緩存項存儲在一個或者多個緩存服務(wù)器上來實現(xiàn)的。每一個緩存項都根據(jù)它的關(guān)鍵字的哈希值來分配到一個服務(wù)器上。

表面看來,Memcached針對ASP.NET的API就像和內(nèi)置的API一樣。這讓開發(fā)人員很容易地轉(zhuǎn)換到Memcached上,僅僅通過在代碼中查找和替換即可實現(xiàn)。

一個被推薦的解決方案是不根據(jù)緩存項的關(guān)鍵字來生成哈希鍵值。這將允許開發(fā)人員能夠讓一個給定頁面中需要的所有緩存項,盡量存放在同一個服務(wù)器上??上?,基于數(shù)據(jù)保存的地方而不是基于緩存項自身的關(guān)鍵字來生成哈希鍵,很容易產(chǎn)生錯誤,需要仔細(xì)來實現(xiàn)(這個算法)。

Memcached是基于Linux運行的,你可以在BSD的許可協(xié)議下使用Memcached。他也提供了針對C#的客戶端以及Perl、Python、PHP、Java和其他語言的API:http://www.danga.com/memcached/apis.bml。還有一個Win32的移植版本(http://jehiah.cz/projects/memcached-win32/),可以讓Memcached運行在非Linux的機(jī)器上。



Cacheman — .NET架構(gòu)下的分布式緩存項目

Cacheman據(jù)說是由微軟旗下的 Popfly 項目組成員 Sriram Krishnan 的作品。是他用業(yè)余時間開發(fā)的。最新的情況是,微軟的 Popfly 網(wǎng)站已經(jīng)“悄悄地”的做了更新,就是采用了 Krishnan 的 Cacheman,更新了緩存機(jī)制。該項緩存技術(shù)更新帶來的性能提升非常顯著,根據(jù)Popfly團(tuán)隊中的 John Montgomery 的說法:加載一個已有的Mashup應(yīng)用時,可以帶來2到6倍的性能提升。

這些說法也得到了 Krishnan 本人的確認(rèn)。他提到這是Cacheman 的第一次的實際應(yīng)用,并自豪的說 Cacheman 不費吹灰之力就拿下了 Popfly 的全部訪問量。

簡單介紹一下 Cacheman 這個項目。資料主要來源于 Krishnan的博客對Cacheman的介紹。

Cacheman是一個基于Windows平臺的快速分布式哈希表。是由純托管代碼實現(xiàn)。中間擱置了有幾個月,直到最近才開始重新上馬這個項目,極可能就是因為Popfly項目需要的緣故才開始著手的。

Krishnan本人對 memcached 很感興趣,于是創(chuàng)建了 Cacheman。Cacheman上有很多 memcached 的影子,比如與memcached相似的文本通訊協(xié)議。Cacheman的通訊協(xié)議公開,任何人可以根據(jù)自己偏愛的語言環(huán)境寫客戶端。 Krishnan 在自己家用電腦(2.4GHz Intel Core 2 帶2GB內(nèi)存)上進(jìn)入測試,達(dá)到了每秒16000次左右的請求,并且還是服務(wù)器與客戶端都是在同一臺服務(wù)器下完成的。

現(xiàn)這款產(chǎn)品還不太完善,作者自身也提到:在Cacheman做指定key的GET/SET/DELETE操作時,客戶端需要弄清需要與哪一臺Cacheman服務(wù)器通訊,為此要對該key做一個快速FNV哈希然后求余得到應(yīng)該和幾臺服務(wù)器中的哪臺服務(wù)器通訊。但該法的缺點在于新增或刪除一個服務(wù)器節(jié)點時,緩存節(jié)點需要大規(guī)模遷移。修復(fù)該問題需要一致性的哈希算法,作者表示還沒有時間解決此事。作者提出了采用中心架構(gòu)的“主緩存服務(wù)器”的解決辦法,讓客戶端輪詢主緩存服務(wù)器來獲取應(yīng)該與那個緩存服務(wù)器通訊,但他也覺的這樣做增加了復(fù)雜性,會帶來些新問題。

可以感覺到,由于 Cacheman 這個個人項目已經(jīng)介入到 Popfly 這個正式產(chǎn)品中,可能很快就會被微軟吸納為正式產(chǎn)品,因此如果有人采用這個產(chǎn)品做自己緩存的解決方案的話,應(yīng)該不必太擔(dān)心后續(xù)的產(chǎn)品升級及文檔支持服務(wù),它的未來前途值的期待。說不定 Krishnan 會從 Popfly 項目脫身出來專職負(fù)責(zé)這個 Cacheman 項目。

目前最新的版本是0.0.2版 :http://www.sriramkrishnan.com/code/。

 

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
ASP.NET緩存全解析3:頁面局部緩存
整理了一下MSDN中關(guān)于ASP.NET緩存機(jī)制的論述 - qdzx2008的專欄 - CS...
Substitution控件
ASP.NET緩存技術(shù)介紹
ASP.NET緩存使用詳解_控件資料
提高網(wǎng)站速度:ASP.NET緩存詳解-程序開發(fā)-紅黑聯(lián)盟
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服