本節(jié)介紹開發(fā)者在使用緩存的時(shí)候,常用的方法。每個(gè)方法在實(shí)際開發(fā)中都可以找到對(duì)應(yīng)的用處,會(huì)有代碼示例。分兩個(gè)部分介紹,第一個(gè)部分包括下面的一些用法:
- 向緩存添加數(shù)據(jù),Add方法,如何向緩存中添加數(shù)據(jù),設(shè)置過期,設(shè)置優(yōu)先級(jí)。
- 從緩存中刪除數(shù)據(jù),Remove方法
- 從緩存中獲取數(shù)據(jù),GetData方法
- 清空緩存,F(xiàn)lush方法
第二部分介紹緩存的加載。
1.1向緩存中添加數(shù)據(jù)
需要緩存的數(shù)據(jù),在創(chuàng)建和傳輸?shù)臅r(shí)候都是很消耗性能的。例如,一個(gè)零售商的應(yīng)用系統(tǒng),一些列產(chǎn)品數(shù)據(jù)需要從數(shù)據(jù)訪問組件傳遞給用戶顯示組件,然后才可以顯示在用戶界面。代表顯示世界的實(shí)體類Products和Orders,為了提升性能,一些數(shù)據(jù)會(huì)被放在緩存中。
你需要向緩存中添加數(shù)據(jù),同時(shí)為過期處理提供過期時(shí)間,為清除處理設(shè)置緩存的優(yōu)先級(jí),先清除優(yōu)先級(jí)低的緩存項(xiàng)。
使用CacheManager的Add方法,如果你沒有設(shè)置過期時(shí)間和優(yōu)先級(jí),會(huì)自動(dòng)設(shè)置默認(rèn)值,分別是NeverExpired永不過期和Normal正常。如果緩存中已經(jīng)存在相同key的項(xiàng),會(huì)先移除舊項(xiàng),然后添加新項(xiàng)。在這個(gè)過程中如果失敗的話,緩存值會(huì)恢復(fù)到原始值。
?
?
?

using ?System.Collections.Generic;
using ?System.Linq;
using ?System.Text;
using ?Microsoft.Practices.EnterpriseLibrary.Caching;
using ?Microsoft.Practices.EnterpriseLibrary.Common;
using ?Microsoft.Practices.EnterpriseLibrary.Caching.Expirations;
namespace ?BeautyCode.Entlib
{
???? public ? class ?Product
????{
???????? public ? string ?ID?{? get ;? set ;?}
???????? public ? string ?Name?{? get ;? set ;?}
???????? public ? decimal ?Price?{? get ;? set ;?}
????}
???? public ? class ?CacheTest
????{
???????? public ?CacheTest()
????????{
????????????ICacheManager?manager? = ?CacheFactory.GetCacheManager();
???????????? string ?id? = ? " 11 " ;
???????????? string ?name? = ? " 土豆 " ;
???????????? decimal ?price? = ? 100 ;
????????????Product?product? = ? new ?Product()?{?ID? = ?id,?kName? = ?name,?Price? = ?price?};
????????????manager.Add(id,?product,?CacheItemPriority.Normal, null , new ?SlidingTime?(TimeSpan.FromMinutes?( 5 )));
????????}
????}
}
?
在上面的代碼中,通過Add方法向緩存中添加數(shù)據(jù),設(shè)置優(yōu)先級(jí)為Normal,過期之后沒有激活任何事件,過期時(shí)間為最后一次訪問之后的5分鐘。
在刪除項(xiàng)的時(shí)候響應(yīng)刪除事件,更新緩存。
在Add方法中,我們可以指定一個(gè)實(shí)現(xiàn)了ICacheItemRefreshAction接口的類方法,當(dāng)從緩存中刪除項(xiàng)的時(shí)候,就會(huì)更新緩存的數(shù)據(jù)。
?

???? public ? class ?ProductCacheRefeshAction?:?ICacheItemRefreshAction
????{
???????? #region ?ICacheItemRefreshAction?Members
???????? public ? void ?Refresh( string ?removedKey,? object ?expiredValue,?CacheItemRemovedReason?removalReason)
????????{
???????????? throw ? new ?NotImplementedException();
????????}
???????? #endregion
????}
?
如果要接收移除緩存項(xiàng)的通知的話,需要在Add方法中設(shè)置參數(shù)
?
?
要點(diǎn):
- 你可以使用整合Unity的方式創(chuàng)建對(duì)象實(shí)例。
- 如果向配置了使用數(shù)據(jù)庫作為后端存儲(chǔ)的緩存中添加項(xiàng)的話,添加的項(xiàng)必須是可序列化的,添加Serializable特性。
-
當(dāng)使用數(shù)據(jù)庫作為后端存儲(chǔ)的時(shí)候,實(shí)現(xiàn)ICacheItemRefreshAction的類必須要可序列化,添加Serializable特性。
1.2從緩存中刪除項(xiàng)
根據(jù)添加項(xiàng)的時(shí)候設(shè)置的掃描策略和過期策略,掃描和過期處理會(huì)自動(dòng)從緩存中刪除項(xiàng)。你也可以手動(dòng)移除某些項(xiàng)。
?
????????{
????????????cache.Remove(key);
????????}
?
1.3從緩存中獲取數(shù)據(jù)
使用CacheManager的GetData方法
?
????????{
???????????? return ?(T)cache.GetData(key);
????????}
?
1.4清空緩存
使用CacheManager的Flush方法,將會(huì)清空緩存中的全部項(xiàng),不管有沒有過期。
?
????????{
????????????cache.Flush();
????????}
? 2、向緩存加載數(shù)據(jù)
在你從緩存獲取數(shù)據(jù)之前,需要先向緩存中添加一些數(shù)據(jù)。你可以通過兩種方式加載數(shù)據(jù):
- 一次性加載,一次性將所需的數(shù)據(jù)加載到緩存中,方便后面的時(shí)候
- 根據(jù)請(qǐng)求加載,當(dāng)發(fā)生數(shù)據(jù)請(qǐng)求的時(shí)候才加載數(shù)據(jù)到緩存
2.1一次性加載
當(dāng)應(yīng)用啟動(dòng)的時(shí)候,一次性加載需要的數(shù)據(jù)。
優(yōu)點(diǎn):
因?yàn)槟憧梢源_保數(shù)據(jù)已經(jīng)被加載到緩存中,理論上你不用判斷緩存的狀態(tài)。但是,在獲取數(shù)據(jù)之前需要檢查數(shù)據(jù)是否存在于緩存中,因?yàn)橛锌赡芫彺姹磺蹇樟恕?
因?yàn)槟闶褂镁彺妫瑧?yīng)用的性能會(huì)提升,應(yīng)用的響應(yīng)也會(huì)更快。
缺點(diǎn):
一次性緩存全部數(shù)據(jù),沒有最大的提升系統(tǒng)的性能,因?yàn)榛ㄙM(fèi)時(shí)間緩存的數(shù)據(jù),包括了一些沒有必要的數(shù)據(jù)。如果應(yīng)用有100個(gè)處理請(qǐng)求,登錄者登錄之后只是處理了1個(gè),那么其他緩存的請(qǐng)求就沒有必要了。
推薦的一次性加載方式
當(dāng)你在應(yīng)用啟動(dòng)或者初始化的時(shí)候一次性家在大量數(shù)據(jù)的話,最好使用后臺(tái)線程進(jìn)行異步加載,如果你不正確的使用一次性加載的方式,你的應(yīng)用在初始化的時(shí)候會(huì)很慢。在下面的情形, 推薦使用一次性加載。
- 對(duì)加載的數(shù)據(jù)的生命周期可控
- 對(duì)加載的數(shù)據(jù)量可控,如果不知道要加載多少數(shù)據(jù)量的話,你有可能會(huì)耗盡系統(tǒng)的資源
2.2根據(jù)請(qǐng)求加載數(shù)據(jù)
優(yōu)點(diǎn):
在應(yīng)用初始化的時(shí)候,因?yàn)闆]有加載大量的數(shù)據(jù),系統(tǒng)資源沒有耗盡。不用加載一些不需要的數(shù)據(jù)。
缺點(diǎn):
使用的時(shí)候,性能會(huì)有點(diǎn)下降,因?yàn)檎?qǐng)求的數(shù)據(jù)可能沒有被緩存,而是從數(shù)據(jù)源獲取然后緩存。在從緩存中獲取之前,也需要檢查數(shù)據(jù)是否已經(jīng)存在于緩存中。這種檢查可能會(huì)在你的代碼中加入過量的條件邏輯。
推薦的根據(jù)請(qǐng)求加載數(shù)據(jù)的方式
- 你需要一些數(shù)據(jù),但是沒有資源加載保存全部的數(shù)據(jù)
- 你需要的數(shù)據(jù)在初始化系統(tǒng)的時(shí)候不能加載,例如數(shù)據(jù)可能和用戶輸入的項(xiàng)有關(guān)系,例如用戶的一些信息。
一次性加載數(shù)據(jù)到緩存的代碼示例
?

????????{
???????????? return ? new ?List < Product > ();
????????}
???????? public ? void ?LoadAllProducts()
????????{
????????????ICacheManager?manager? = ?CacheFactory.GetCacheManager();
????????????List < Product > ?list? = ?GetProductList();
???????????? foreach ?(Product?p? in ?list)
????????????{
????????????????manager.Add(p.ID,?p);
????????????}
????????}
?
?
下面是一段根據(jù)請(qǐng)求加載數(shù)據(jù)到緩存的代碼示例
?

????????{
???????????? return ? new ?Product();
????????}
???????? public ?Product??ReadProductByID( string ?productID)
????????{
????????????ICacheManager?manager? = ?CacheFactory.GetCacheManager();
????????????Product?p? = ?(Product)manager.GetData(productID);
???????????? if ?(p? == ? null )
????????????{
????????????????p? = ?GetByID(productID);
???????????????? if ?(p? != ? null )
????????????????????manager.Add(productID,?p);
????????????}
???????????? return ?p;
????????}
?
?
首先檢查緩存中是否存在相同key的項(xiàng),如果沒有就從數(shù)據(jù)源獲取,然后加入緩存并且返回?cái)?shù)據(jù)。
未完待續(xù)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
