asp.net SAF 中緩存服務(wù)的實(shí)現(xiàn)第1/5頁(yè)
protected void Page_Load(object sender, EventArgs e)
{
webinfo info = new webinfo();
Response.Write("有static的執(zhí)行結(jié)果:" + webinfo.a + "<br />");
Response.Write("沒(méi)有static的執(zhí)行結(jié)果:" + info.b);
}
public class webinfo
{
public static DateTime a = DateTime.Now;
public DateTime b = DateTime.Now;
}
下面內(nèi)容多摘自該文章:結(jié)果是只要站點(diǎn)不重啟(代碼也不修改),那么a的值是恒定不變的,即使將頁(yè)面關(guān)了重新打開(kāi)也一樣;而b則是刷新就變化。如果你從事Asp.Net的開(kāi)發(fā),提起緩存你可能首先會(huì)想到Output Cache、數(shù)據(jù)源緩存或者是基于System.Web.Caching.Cache的對(duì)象緩存。實(shí)際上緩存的目的就是把對(duì)象(數(shù)據(jù))存儲(chǔ)在內(nèi)存中,不用每次需要對(duì)象服務(wù)的時(shí)候都重新創(chuàng)建對(duì)象(相對(duì)耗時(shí))。將對(duì)象聲明為static,那么對(duì)象將在其所屬的類(lèi)被載入AppDomain時(shí)初始化,這樣對(duì)象的生命周期與AppDomain同樣長(zhǎng),從而起到緩存的目的。
設(shè)計(jì)思想
我們經(jīng)常需要在應(yīng)用程序中緩存一些常用數(shù)據(jù)供全局使用以提升性能。如果需要緩存的對(duì)象類(lèi)型和數(shù)目是固定的,我們可能會(huì)直接將其聲明為static;如果我們需要緩存的對(duì)象類(lèi)型和數(shù)目是不定的,我們可能會(huì)借助一個(gè)static Hashtable來(lái)實(shí)現(xiàn)。但是Hashtable有個(gè)缺陷:它沒(méi)有層次結(jié)構(gòu),它總是以鍵/值的形式來(lái)存儲(chǔ)數(shù)據(jù),一個(gè)Key對(duì)應(yīng)一個(gè)Value,如果我們想獲取相關(guān)聯(lián)的一組數(shù)據(jù)就會(huì)比較困難了。
XML文檔結(jié)構(gòu)是樹(shù)形的,具有標(biāo)準(zhǔn)的層次結(jié)構(gòu)。XPath用于從Xml文檔中選擇一個(gè)或多個(gè)結(jié)點(diǎn)。比如 "/BookStore/Book",選擇Book結(jié)點(diǎn)下的所有子結(jié)點(diǎn)。
SAF 中的緩存服務(wù)通過(guò)一個(gè)在內(nèi)存中動(dòng)態(tài)構(gòu)造的Xml文檔樹(shù)作為橋梁,將靜態(tài)(static)緩存和XPath 這兩個(gè)技術(shù)結(jié)合了起來(lái),支持使用XPath的語(yǔ)法來(lái)獲取Hashtable中對(duì)象。其中靜態(tài)緩存進(jìn)行實(shí)際的數(shù)據(jù)緩存,XPath用于獲取數(shù)據(jù)對(duì)象。從程序員的角度來(lái)看,即是Hashtable的Key支持了XPath的語(yǔ)法,可以將原本“平板式”的Hashtable想象成為一個(gè)“樹(shù)形結(jié)構(gòu)”,它的結(jié)點(diǎn)包含了緩存的數(shù)據(jù),我們通過(guò)標(biāo)準(zhǔn)的XPath到達(dá)結(jié)點(diǎn)(當(dāng)然這只是一個(gè)假象)并獲取數(shù)據(jù)。通過(guò)這種方式就可以使用XPath來(lái)一次獲取Hashtable中的多個(gè)相關(guān)數(shù)據(jù)對(duì)象。 簡(jiǎn)單說(shuō),SAF緩存服務(wù)是為了實(shí)現(xiàn)一個(gè)有層次(樹(shù)形)的緩存結(jié)構(gòu),從而實(shí)現(xiàn)對(duì)緩存更加靈活的操作。
而實(shí)際上是怎么實(shí)現(xiàn)這一過(guò)程的呢?我們一步步來(lái)看:
1、首先在內(nèi)存中動(dòng)態(tài)構(gòu)建一個(gè) Xml文檔,它只包含一個(gè)根結(jié)點(diǎn),可以任意命名,這里將它命名為了Cache。
2、提供一個(gè)Xpath路徑:獲取對(duì)象(數(shù)據(jù))前首先要存儲(chǔ)對(duì)象,存對(duì)象自然要先提供一個(gè)路徑(這里稱(chēng)為“路徑”,是因?yàn)樗且粋€(gè)XPath,實(shí)際上也就相當(dāng)于Hashtable中的鍵Key)。
3、根據(jù)上一步提供的路徑,以Cache為根結(jié)點(diǎn),逐層深入地創(chuàng)建XmlNode結(jié)點(diǎn)。
4、生成一個(gè)GUID,在葉結(jié)點(diǎn)上添加一個(gè)Key屬性,為這個(gè)Key屬性賦值為GUID。
5、在Hashtable中存儲(chǔ)對(duì)象,其中Hashtable的Key即為上一步生成的GUID,而Value為要存儲(chǔ)的對(duì)象。
使用這種方式,Hashtable的實(shí)際的Key,即動(dòng)態(tài)生成的GUID對(duì)程序員來(lái)說(shuō)是透明的,程序員在存儲(chǔ)/獲取對(duì)象時(shí),只需要提供XPath表達(dá)式就可以。下面這幅圖說(shuō)明了它們之間的關(guān)系:

這里還需要再說(shuō)明三點(diǎn):
1、我們使用Hashtable存儲(chǔ)對(duì)象,可以直接將Hashtable聲明為static的,也可以將Hashtable聲明為instance的,但是將Hashtable所屬的對(duì)象聲明為static的。這里應(yīng)用了Singleton模式,先將對(duì)Hashtable的操作封裝成一個(gè)類(lèi),然后在這個(gè)類(lèi)上應(yīng)用Singleton模式,確保了這個(gè)類(lèi)只有一個(gè)(這個(gè)類(lèi)所維護(hù)的Hashtable實(shí)例自然也只有一個(gè)了)。很明顯,這個(gè)類(lèi)包含了主要的邏輯,我們將之命名為Cache。
2、使用Hashtable的好處是可以存儲(chǔ)任何類(lèi)型的對(duì)象,缺點(diǎn)是喪失了類(lèi)型安全。有時(shí)候我們可能會(huì)想使用一個(gè)泛型集合類(lèi)來(lái)取代Hashtable,比如Dictionary<T key, T value>。所以這里又引入了Strategy模式,創(chuàng)建了一個(gè)ICacheStrategy接口,這個(gè)接口包括三個(gè)方法,分別用于添加、獲取、刪除對(duì)象。
3、用Xpath獲取結(jié)點(diǎn)時(shí),可以是基于當(dāng)前結(jié)點(diǎn)的相對(duì)路徑;也可以是基于根結(jié)點(diǎn)的絕對(duì)路徑。在本文的范例程序中,使用的是絕對(duì)路徑,顯然這樣更加方便一些。
相關(guān)文章
Excel自定義關(guān)閉按鈕實(shí)現(xiàn)代碼
這篇文章主要介紹了Excel自定義關(guān)閉按鈕實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12
.net開(kāi)發(fā)微信公眾平臺(tái)實(shí)例教程
這篇文章主要介紹了.net開(kāi)發(fā)微信公眾平臺(tái)的方法,對(duì)微信公眾平臺(tái)開(kāi)發(fā)的原理與相應(yīng)的.net實(shí)現(xiàn)方法都做了較為詳細(xì)的講述,非常實(shí)用,需要的朋友可以參考下2014-10-10
.Net 調(diào)用存儲(chǔ)過(guò)程取到return的返回值
存儲(chǔ)過(guò)程只能返回 int 類(lèi)型,如果返回一個(gè)字符串 ,將會(huì)報(bào)類(lèi)型轉(zhuǎn)化錯(cuò)誤,下面以示例介紹下如何取到return的值,需要的朋友可以參考下2014-08-08
ASP.NET C#生成下拉列表樹(shù)實(shí)現(xiàn)代碼
下拉列表樹(shù)很方便且時(shí)尚的一個(gè)導(dǎo)航,貌似很多的朋友都想實(shí)現(xiàn)這樣一個(gè)列表樹(shù),本文將滿(mǎn)足你們的設(shè)想,通過(guò)本文你們可以學(xué)到如何使用c#生成下拉列表樹(shù),感興趣的你可不要錯(cuò)過(guò)了啊2013-02-02
ASP.NET數(shù)據(jù)綁定之DataList控件
這篇文章主要為大家介紹了ASP.NET數(shù)據(jù)綁定中的DataList控件,DataList控件以表的形式呈現(xiàn)數(shù)據(jù),通過(guò)該控件,您可以使用不同的布局來(lái)顯示數(shù)據(jù)記錄,對(duì)DataList控件感興趣的小伙伴們可以參考一下2016-01-01
ASP.NET Core 3.0輕量級(jí)角色API控制授權(quán)庫(kù)
這篇文章介紹了ASP.NET Core 3.0輕量級(jí)角色API控制授權(quán)庫(kù),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01
ASP.NET Core中如何實(shí)現(xiàn)重定向詳解
這篇文章主要給大家介紹了關(guān)于ASP.NET Core中如何實(shí)現(xiàn)重定向的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
用Html5與Asp.net MVC上傳多個(gè)文件的實(shí)現(xiàn)代碼
Html 5 的有一些File API,對(duì)Form表單增強(qiáng)的特性,讓我們輕松支持多文件上傳,看下面的Html片斷代碼2012-08-08
.NET 中的裝箱與拆箱實(shí)現(xiàn)過(guò)程
本文分別介紹裝箱(boxing)與拆箱(unboxing)的實(shí)現(xiàn)過(guò)程,感興趣的朋友可以了解下2013-01-01
ASP.NET DataTable去掉重復(fù)行的2種方法
這篇文章主要介紹了ASP.NET DataTable去掉重復(fù)行的2種方法,本文直接給出去重代碼,需要的朋友可以參考下2015-02-02

