<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
.NET 4.0中新增了一個System.Runtime.Caching的名稱空間,它提供了一系列可延伸的Cache框架,本文就簡單的介紹一下如何使用它給程式新增Cache。
一個Cache框架主要包括三個部分:ObjectCache、CacheItemPolicy、ChangeMonitor。
ObjectCache表示一個CachePool,它提供了Cache物件的新增、獲取、更新等介面,是Cache框架的主體。它是一個抽象類,並且系統給了一個常用的實現——MemoryCache。
CacheItemPolicy則表示Cache過期策略,例如儲存一定時間後過期。它也經常和ChangeMonitor一起使用,以實現更復雜的策略。
ChangeMonitor則主要負責CachePool物件的狀態維護,判斷物件是否需要更新。它也是一個抽象類,系統也提供了幾個常見的實現:CacheEntryChangeMonitor、FileChangeMonitor、HostFileChangeMonitor、SqlChangeMonitor。
如下是一個簡單的範例:
class MyCachePool { ObjectCache cache = MemoryCache.Default; const string CacheKey = "TestCacheKey"; public string GetValue() { var content = cache[CacheKey] as string; if(content == null) { Console.WriteLine("Get New Item"); var policy = new CacheItemPolicy() { AbsoluteExpiration = DateTime.Now.AddSeconds(3) }; content = Guid.NewGuid().ToString(); cache.Set(CacheKey, content, policy); } else { Console.WriteLine("Get cached item"); } return content; } public static void Test() { var cachePool = new MyCachePool(); while (true) { Thread.Sleep(1000); var value = cachePool.GetValue(); Console.WriteLine(value); Console.WriteLine(); } } }
這個例子建立了一個儲存3秒鐘Cache:三秒鐘內獲取到的是同一個值,超過3秒鐘後,資料過期,更新Cache,獲取到新的值。
從前面的例子中我們可以看到,將一個Cache物件加入CachePool中的時候,同時加入了一個CacheItemPolicy物件,它實現著對Cache物件超期的控制。例如前面的例子中,我們設定超時策略的方式是:AbsoluteExpiration = DateTime.Now.AddSeconds(3)
。它表示的是一個絕對時間過期,當超過3秒鐘後,Cache內容就會過期。
除此之外,我們還有一種比較常見的超期策略:按存取頻度決定超期。例如,如果我們設定如下超期策略:SlidingExpiration = TimeSpan.FromSeconds(3)。它表示當物件3秒鐘內沒有得到存取時,就會過期。相對的,如果物件一直被存取,則不會過期。這兩個策略並不能同時使用。
CacheItemPolicy也可以制定UpdateCallback和RemovedCallback,方便我們記紀錄檔或執行一些處理操作,非常方便。
雖然前面列舉的過期策略是非常常用的策略,能滿足我們大多數時候的需求。但是有的時候,過期策略並不能簡單的按照時間來判斷。例如,我Cache的內容是從一個文字檔案中讀取的,此時過期的條件則是檔案內容是否發生變化:當檔案沒有發生變更時,直接返回Cache內容,當問及發生變更時,Cache內容超期,需要重新讀取檔案。這個時候就需要用到ChangeMonitor來實現更為高階的超期判斷了。
由於系統已經提供了檔案變化的ChangeMonitor——HostFileChangeMonitor,這裡就不用自己實現了,直接使用即可。
public string GetValue() { var content = cache[CacheKey] as string; if(content == null) { Console.WriteLine("Get New Item"); var file = @"r:test.txt"; CacheItemPolicy policy = new CacheItemPolicy(); policy.ChangeMonitors.Add(new HostFileChangeMonitor(new List<string> { file })); content = File.ReadAllText(file); cache.Set(CacheKey, content, policy); } else { Console.WriteLine("Get cached item"); } return content; }
這個例子還是比較簡單的,對於那些沒有自定義的策略,則需要我們實現自己的ChangeMonitor,現在一時也想不到合適的例子,下次有時間在寫篇文章更深入的介紹一下吧。
到此這篇關於C#使用Cache框架實現Cache操作的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45