應(yīng)用系統(tǒng)為了提升效率,可以將一些配置信息等不常改變的數(shù)據(jù)進行緩存以減少對數(shù)據(jù)源的讀取頻率。通常的做法是在程序中使用靜態(tài)變量來存儲,再設(shè)置一個Timer,每隔一段時間對數(shù)據(jù)進行更新等操作。EnterpriseLibrary的Cache提供了非常強大的支持,可以設(shè)置絕對時間、間隔時間、自定義格式以及文件過期時間來進行相應(yīng)的更新操作。
1. 絕對時間過期的緩存:AbsoluteTime
2. 相對時間過期的緩存:SlidingTime
3. 自定義格式過期的緩存:ExtendedFormatTime
自定義格式為:<Minute> <Hour> <Day of month> <Month> <Day of week>
Minute 0-59
Hour 0-23
Day of month 1-31
Month 1-12
Day of week 0-6 (Sunday is 0)
如:
* * * * * - expires every minute
5 * * * * - expire 5th minute of every hour
* 21 * * * - expire every minute of the 21st hour of every day
31 15 * * * - expire 3:31 PM every day
7 4 * * 6 - expire Saturday 4:07 AM
4. 文件的過期緩存:FileDependency
簡單的程序代碼如下:
CacheManager cacheManager = CacheFactory.GetCacheManager();
ExtendedFormatTime expireTime = new ExtendedFormatTime("41 11 * * *");
cacheManager.Add("key", value, CacheItemPriority.Normal, new ProductCacheRefreshAction(), expireTime);
上述代碼即將value放入到以key為鍵值的默認換成塊中,且在每天的11點41分緩存中的值失效,需要重新讀取數(shù)據(jù)源。
Cache以配置文件的方式供用戶進行緩存的輪詢過期數(shù)據(jù)的頻率、緩存中數(shù)據(jù)項的多少、清除數(shù)據(jù)項的多少以及緩存?zhèn)浞莸奈恢谩?/p>
1. expirationPollFrequencyInSeconds: 設(shè)置控制后臺調(diào)度程序多久檢查過期條目的定時器。此屬性必須是正整數(shù),且是必要的。
2. maximumElementsInCacheBeforeScavenging: 設(shè)置在清除開始前可以在緩存中的條目的最大數(shù)量。此屬性必須是正整數(shù),且是必要的。
3. numberToRemoveWhenScavenging: 設(shè)置在清除開始時移除的條目的數(shù)量,此屬性必須是正整數(shù),且是必要的。
4. backingStoreName: 緩存?zhèn)浞莸奈恢?
值得一提的是,expirationPollFrequencyInSeconds屬性是控制后臺調(diào)度程序多久檢查過期條目的配置,單位為秒,如果系統(tǒng)經(jīng)常需要更新數(shù)據(jù)則可以將此值設(shè)置的小一點;ICacheItemExpiration的時間是以UTC的時間來作為標(biāo)準(zhǔn)時間來比較的,北京時間比UTC早8個小時,比如你需要在每天的十二點半讓緩存過期,則必須這樣設(shè)置ExtendedFormatTime("30 4 * * *"), 關(guān)于這個問題我本來不知道,以為是Library的Bug,上網(wǎng)也沒有找到相關(guān)的例子,最后在看了原程序才知道Library是用的UTC來進行比較的。