HostFileChangeMonitor
最近看到黑暗大寫了一篇有關自動清除, 更新Cache的文章
雖說對Cache總是有一個概念在那邊,但從未在C#實做過,非常感興趣
以往在工作上不外乎是使用者把檔案上傳上來,系統處理掉就結束了,並沒有採用像這種Cache的機制
但針對於某些外部系統拋轉進來的Master data,也都是採取處理完就刪除的機制,下次程式跑起來再繼續做一樣的事
這麼說來,好像Cache的機制對我現行沒什麼太多的幫助
但看完文章,個人的看法是,如果有些資料是針對txt或其他格式進來系統
但又不是要寫入資料庫的話,也許未來可以採用這樣的方式處理,也可以少開table
所以我開始從C#開始照表抄課
const string CACHE_KEY = "MyCustomCache";
var cache = MemoryCache.Default;
lock (cache)
{
if (cache[CACHE_KEY] == null)
{
CacheItemPolicy policy = new CacheItemPolicy()
{
AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddHours(1))
};
List<string> lstFile = new List<string>() { @"YourFile.txt" };
policy.ChangeMonitors.Add(new HostFileChangeMonitor(lstFile));
string content = readFile(lstFile[0]);
cache.Add(CACHE_KEY, content, policy);
Console.WriteLine("Expired, data = " + cache[CACHE_KEY]);
}
else
{
Console.WriteLine("Not Expired, data = " + cache[CACHE_KEY]);
}
}
每次跑完都會是Cache expired,讓我摸不著頭緒,難道是程式寫錯了嗎
想了一下發現C#會自動做GC,所以Cache應該是跟著這個Thread執行完就被回收掉了吧
為了證實這一點,我同時也寫了同樣的一段程式碼在IIS上跑,果然就正常無誤
因為WebSite的Thread在IIS上掛著並不會結束,除非我們手動去IIS把這個站台停掉,再重新啟動
這樣的話Cache就會被自動回收掉
以下是web site上的測試結果, Auto expire設定為1小時後
但若是檔案被更新存檔的話,再按F5重整頁面時即可Cache會被清掉,重新讀取這個檔案
達到同樣的Master Data只有在Expire 或是檔案更動的同時才會被重新處理,若是沒異動或是沒有Expire就沿用既有的Cache資料
以達到節省Server資源的效用