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

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方法向緩存中添加數據,設置優先級為Normal,過期之后沒有激活任何事件,過期時間為最后一次訪問之后的5分鐘。
在刪除項的時候響應刪除事件,更新緩存。
在Add方法中,我們可以指定一個實現了ICacheItemRefreshAction接口的類方法,當從緩存中刪除項的時候,就會更新緩存的數據。
?

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

????????{
???????????? 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);
????????????}
????????}
?
?
下面是一段根據請求加載數據到緩存的代碼示例
?

????????{
???????????? 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的項,如果沒有就從數據源獲取,然后加入緩存并且返回數據。
未完待續。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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