File Cache 自動更新

  • 837
  • 0
  • C#
  • 2019-05-12

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資源的效用