日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

微軟企業(yè)庫4.1學(xué)習(xí)筆記(十八)緩存模塊6 緩存

系統(tǒng) 1937 0

  設(shè)計(jì)緩存的目的

  緩存模塊可以用來實(shí)現(xiàn)下列功能:

  •   提供了一系列的API
  •   它使得開發(fā)者不需要學(xué)習(xí)很多內(nèi)部的工作機(jī)制,就可以將常用的緩存功能加入應(yīng)用
  •   使用企業(yè)庫的配置工具很容易配置
  •   性能高效
  •   線程安全,內(nèi)部的代碼考慮到了在多個(gè)線程調(diào)用,沒有非預(yù)期的內(nèi)部交互。
  •   使用后端存儲(chǔ),使得發(fā)生以外也可以保持?jǐn)?shù)據(jù)的完整無缺。
  •   保證了內(nèi)存中的數(shù)據(jù)和后端存儲(chǔ)保持?jǐn)?shù)據(jù)同步。

  本節(jié)講述一些緩存模塊設(shè)計(jì)的亮點(diǎn),和設(shè)計(jì)的細(xì)節(jié)。還包括一些過期處理的設(shè)計(jì)和掃描處理的設(shè)計(jì)。

  1、設(shè)計(jì)亮點(diǎn)

微軟企業(yè)庫4.1學(xué)習(xí)筆記(十八)緩存模塊6 緩存的設(shè)計(jì)目的

  上圖顯示的是緩存模塊中關(guān)鍵類之間的關(guān)系。

  當(dāng)你用CacheFactory初始化一個(gè)CacheManager對(duì)象的時(shí)候,在內(nèi)部創(chuàng)建了一個(gè)CacheManagerFactory對(duì)象,創(chuàng)建了一個(gè)Cache對(duì)象。常見Cache對(duì)象之后,在后端存儲(chǔ)的所有數(shù)據(jù)被加載到內(nèi)存中,放在Cache對(duì)象中。然后應(yīng)用可以用CacheManager發(fā)出請(qǐng)求,獲取數(shù)據(jù)添加數(shù)據(jù),刪除數(shù)據(jù)。

  當(dāng)應(yīng)用向CacheManager發(fā)送請(qǐng)求,使用GetData方法從緩存中獲取數(shù)據(jù)的時(shí)候,CacheManager對(duì)象會(huì)請(qǐng)求Cache對(duì)象。如果請(qǐng)求項(xiàng)存在的話,返回緩存的數(shù)據(jù),如果不存在返回null,如果對(duì)象過期,也返回null。

  當(dāng)應(yīng)用使用CacheManager的add方法,向緩存中添加項(xiàng)的時(shí)候,CacheManager同樣將請(qǐng)求發(fā)送給Cache對(duì)象。如果已經(jīng)存在一個(gè)同樣key的項(xiàng)的話,Cache首先會(huì)刪除原來的項(xiàng),然后加入新項(xiàng)。如果緩存的后端存儲(chǔ)是默認(rèn)的NullBackingStore,數(shù)據(jù)只是寫入內(nèi)存。如果添加項(xiàng)的時(shí)候,達(dá)到了緩存存儲(chǔ)數(shù)據(jù)量的上限的話,BackgroundSchedule對(duì)象就會(huì)開始掃描,進(jìn)行過期處理。

  如果添加的項(xiàng)在內(nèi)存緩存中沒有的話,Cache首先創(chuàng)建一個(gè)復(fù)制品,然后添加到內(nèi)存的hashtable中,然后鎖定內(nèi)存中的項(xiàng),添加項(xiàng)到后端存儲(chǔ),然后替代內(nèi)存hashtable中的項(xiàng)。如果在寫入后端存儲(chǔ)的時(shí)候發(fā)生異常,就會(huì)從內(nèi)存緩存中刪除那個(gè)復(fù)制品。緩存模塊擁有很強(qiáng)的異常安全保護(hù),意味著如果加入項(xiàng)的時(shí)候發(fā)生異常,緩存的狀態(tài)可以回滾的添加之前的狀態(tài)。換句話說,除非添加項(xiàng)成功,否則緩存的狀態(tài)不會(huì)改變。(同樣也適用于刪除項(xiàng)和清空項(xiàng))

  BackgroundSchedule對(duì)象周期性的監(jiān)測緩存中的項(xiàng)。當(dāng)一個(gè)項(xiàng)過期,BackgroundSchedule首先會(huì)移除項(xiàng),然后有可能會(huì)通知應(yīng)用,項(xiàng)被移除。這時(shí)候,應(yīng)用的責(zé)任就是更新緩存。

  2、設(shè)計(jì)細(xì)節(jié)

  CacheManager是一個(gè)接口類型,所有的緩存操作都通過接口調(diào)用。如果開發(fā)者沒有修改直接使用緩存模塊的話,CacheManager對(duì)象提供了訪問緩存需要的全部方法,獲取、添加、刪除、清空項(xiàng)。每個(gè)方法都是線程安全的。

  使用CacheFactory類創(chuàng)建一個(gè)CacheManager對(duì)象,還會(huì)創(chuàng)建一個(gè)CacheManagerFactory類。CacheManagerFactory類會(huì)創(chuàng)建實(shí)現(xiàn)一個(gè)CacheManager所需要的內(nèi)部類。

  不同的緩存不能共享相同的后端儲(chǔ)存,每個(gè)CacheManager都只能對(duì)應(yīng)一個(gè)后端存儲(chǔ)。Cache對(duì)象接收從CacheManager對(duì)象發(fā)送過來的請(qǐng)求,實(shí)現(xiàn)了所有的在內(nèi)存緩存和后端儲(chǔ)存之間的操作。包含了一個(gè)hashtable來存儲(chǔ)內(nèi)存中對(duì)應(yīng)的數(shù)據(jù),一個(gè)數(shù)據(jù)項(xiàng)作為一個(gè)CacheItem對(duì)象。這個(gè)對(duì)象包括數(shù)據(jù)本身,還包括了項(xiàng)的key,優(yōu)先級(jí),RefreshAction對(duì)象,和過期策略。這些信息都存放在一個(gè)hashtable中,Cache也是線程安全的。Cache用一個(gè)同步的hashtable控制應(yīng)用和BackgroundSchedule對(duì)緩存中的項(xiàng)的訪問。

  BackgroundSchedule對(duì)象的責(zé)任就是進(jìn)行過期處理,掃描低級(jí)別的項(xiàng)。PollTimer對(duì)象激活過期循環(huán),一個(gè)數(shù)字是一次掃描處理移除的項(xiàng)目。這些都在配置文件中可以設(shè)置。

  緩存模塊中的緩存存儲(chǔ)類包括DataBackingStore、IsolateStorageBackingStore、和NullBackingStore。如果你想要實(shí)現(xiàn)自定義的后端存儲(chǔ),你需要實(shí)現(xiàn)IBackingStore接口,或者是繼承BaseBackingStore類,這個(gè)類也實(shí)現(xiàn)了IBackingStore接口。這個(gè)基類包含了實(shí)現(xiàn)任何后端存儲(chǔ)所需要的策略和工具方法。

  當(dāng)后段存儲(chǔ)是使用數(shù)據(jù)庫的時(shí)候,可以用DataBackingStore類。在配置工具中,對(duì)應(yīng)于一個(gè)數(shù)據(jù)庫實(shí)例的名稱。

  DataBackingStroe和IsolatedBackingStore類可以在持久化之前加密緩存項(xiàng)。加密緩存項(xiàng)可以通過配置來激活。使用配置工具,緩存存儲(chǔ)可以使用配置好的加密算法provider。provider的name在從緩存中讀取數(shù)據(jù),然后在顯示之前解密的時(shí)候同樣需要。

?  過期策略的設(shè)計(jì)

  緩存模塊的過期處理是靠BackgroundSchedule來執(zhí)行的。它會(huì)周期性的檢查hashtable中的緩存項(xiàng),看是否有過期項(xiàng)。你可以在配置緩存模塊的時(shí)候設(shè)置檢查周期的時(shí)間。

  緩存模塊提供了四個(gè)過期策略:

  •   Absolute,意味著緩存項(xiàng)在一個(gè)特定的時(shí)間過期
  •   Sliding,意味著緩存項(xiàng)在最后一次訪問之后的固定時(shí)間過期,默認(rèn)為2分鐘。
  •   Expended format,你可以詳細(xì)描述過期條件,例如,可以設(shè)定為每個(gè)星期六晚上10:00,或者是每個(gè)月的第三個(gè)星期日。Expended formats在ExpendedFormat.cs文件中列出來很多。
  •   File dependency,意味著當(dāng)一個(gè)文件被修改,緩存項(xiàng)就過期

  前三個(gè)過期選項(xiàng)都是以時(shí)間為基礎(chǔ)的,如果數(shù)據(jù)的更新時(shí)間是規(guī)則的,或者是在一個(gè)特定的時(shí)間更新,你可以使用前三個(gè)選項(xiàng)。

  第四個(gè),文件依賴,是以通知為基礎(chǔ)的。它指定緩存項(xiàng)的過期依賴一個(gè)特定的文件,如果文件被修改,緩存項(xiàng)就過期,就會(huì)刪除緩存項(xiàng)。

  Add方法有兩個(gè)重載,一個(gè)設(shè)置了默認(rèn)的過期策略,NeverExpired。另外一個(gè)你可以設(shè)置適合自己的過期策略。你甚至可以設(shè)置自定義的策略,如果你為一個(gè)緩存項(xiàng)設(shè)置了多個(gè)策略,  如果由一個(gè)策略符合條件,緩存項(xiàng)就會(huì)過期。

  標(biāo)記和清除

  過期包括兩個(gè)步驟。一個(gè)就是標(biāo)記,另外一個(gè)就是清除。分為兩個(gè)步驟,就是為了避免BackgroundSchedule清除一個(gè)應(yīng)用正在使用的緩存項(xiàng)可能發(fā)生的沖突。

  在標(biāo)記過程中,BackgroundSchedule會(huì)拷貝一份hashtable,然后檢查里面的每一個(gè)緩存項(xiàng),看看有沒有過期的。這時(shí)候會(huì)鎖定緩存項(xiàng),如果發(fā)現(xiàn)過期的,就會(huì)打個(gè)標(biāo)記。

  在清除過程中,BackgroundSchedule會(huì)重新檢查緩存項(xiàng)的標(biāo)記,看看在打上標(biāo)記之后是否有訪問記錄。如果有訪問記錄,就保留緩存項(xiàng)。如果沒有,就過期它,刪除它。緩存項(xiàng)過期的時(shí)候,會(huì)引發(fā)WMI事件。

  回調(diào)callbacks

  開發(fā)者可以選擇add方法的另外一個(gè)重載,使得在緩存項(xiàng)過期,刪除緩存項(xiàng)的時(shí)候發(fā)通知給應(yīng)用,如果有必要,應(yīng)用可以更新緩存。

  掃描處理的設(shè)計(jì)

  緩存模塊的掃描處理也是由BackgroundSchedule執(zhí)行的。在每次有緩存項(xiàng)加入的時(shí)候都會(huì)檢查,緩存項(xiàng)的數(shù)目是否達(dá)到設(shè)置的最大值。數(shù)量是設(shè)置在CacheManager實(shí)例上的。

  當(dāng)加入一個(gè)緩存項(xiàng)的時(shí)候,可以設(shè)置優(yōu)先級(jí),有四個(gè)選項(xiàng):Low,Normal,High,NotRemovable。刪除的時(shí)候會(huì)按照優(yōu)先級(jí)的高低進(jìn)行處理,優(yōu)先級(jí)低的會(huì)先被清除。默認(rèn)值是Normal。

  當(dāng)你想讓一個(gè)緩存項(xiàng)直到它過期才被清除的話,可以設(shè)置為NotRemovable。最好不要設(shè)置為NotRemovable,因?yàn)榫彺媸怯脕硖嵘阅艿模粦?yīng)該被作為一種持久化手段。

  不想過期處理包括兩個(gè)過程,掃描處理只有一個(gè)過程。

?

?

  未完待續(xù)。。。。。。。。。。。。。。。。。。。。。。

微軟企業(yè)庫4.1學(xué)習(xí)筆記(十八)緩存模塊6 緩存的設(shè)計(jì)目的


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 威宁| 嘉荫县| 庄河市| 吐鲁番市| 黎平县| 富阳市| 敦化市| 连州市| 连云港市| 拜城县| 定陶县| 广东省| 清水县| 龙口市| 迁安市| 永城市| 萨嘎县| 肥西县| 横山县| 龙口市| 全南县| 琼结县| 古浪县| 图木舒克市| 资源县| 保定市| 余姚市| 武安市| 都兰县| 科技| 长阳| 靖边县| 松滋市| 遂川县| 搜索| 错那县| 依安县| 河北区| 清远市| 张家口市| 沐川县|