從.net 4 開始,非web項目也可以使用緩存技術,故曰:.net 4 乃框架成熟之標志也。
對於緩存嘛,耍過 ASP.NET 的伙伴們肯定知道,這么說吧,就是將一些使用頻率較高的數據放於內存中,並設置一個過期時間(比如30秒),只要緩存數據還沒有過期,下一次在訪問數據時就可以直接從緩存加載,而不需要重新讀取。你想啊,如果數據是從數據庫中讀取的,或者通過網絡從其他地方獲得的,那么,采用緩存技術,就可以減少讀取數據的次數,綠色環保。
當然了,要實時更新的內容就不能放到緩存中了,比如實時在線視頻,你就不能把視頻數據放在緩存,不然就會變得太幽默了。
對於非web應用程序,在 System.Runtime.Caching 命名空間下面提供了一堆類型,支持緩存操作,緩存的數據是存放在內存中的,因此,框架提供了一個 MemoryCache 類,用來管理緩存,可存入緩存的數據類型為object,所以說,各種東東你都可以往里面塞。
在 99.995% 的情況下,你只需要訪問該類的 Default 屬性就能夠獲取一個 MemoryCache 實例,然后你直接用這個系統默認的緩存管理對象來寫入和讀取緩存數據了。
緩存的操作類似於字典,你得為緩存項安排一個 Key,這個 key 必須是唯一的,然后這個key會對應一個value,value的類型是object,所以你可以往里面放各種數據。例如從網絡上獲取的數據,文件的內容等。
要向緩存寫入數據,老周大概介紹以下兩種方案:
1、調用MemoryCache實例的Add方法,它需要兩個參數,第一個參數是CacheItem對象,用起來很簡單,實例化時設置key和value就行了,RegionName一般可以不管理它;第二個參數是CacheItemPolicy對象,它用來配置緩存項的參數,比如,AbsoluteExpiration屬性設置該緩存項在啥時候過期,必要的時候,可以向ChangeMonitors屬性添加一些監控器,例如監控文件變化等,假設你是把某個文件的內容放到緩存中,如果文件被修改了,那么該項緩存就會馬上無效。還有要注意SlidingExpiration屬性,它設置一個時間,如果緩存在這個時間內沒有被訪問,就會刪除該項。它與AbsoluteExpiration不同,AbsoluteExpiration指定的是絕對的過期時間,不管緩存項有沒有被訪問,只要到期就會刪除,而SlidingExpiration屬性是指在這個時間后如果緩存項沒有被訪問,就會刪除,兩者不同。
2、調用MemoryCache實例的Set方法,該方法有兩個重載,如果不需要詳細的設置,可以指定key、value以及過期的時間即可,即調用以下重載:
void Set(string key, object value, DateTimeOffset absoluteExpiration, string regionName = null)
regionName默認為null,在MemoryCache類中不使用,所以不用管它。
要是你想對緩存項做更多設置,可以使用這個版本的重載:
void Set(string key, object value, CacheItemPolicy policy, string regionName = null)
記住:value不能設置為null,這樣沒有實際意義。你把null放到緩存中有個毛用。
如果想手動去刪除某個緩存項,可以調用Remove方法,提供緩存項的key即可。
下面提供一個例子,請看代碼:
// 獲取默認的 MemoryCache 實例 MemoryCache cache = MemoryCache.Default; // 用於存儲緩存項的鍵名 const string CACHE_ITEM_NAME = "my_data"; …… string content = string.Empty; // 首先判緩存項是否存在 if (cache.Contains(CACHE_ITEM_NAME)) { // 如果緩存項有效 // 就從緩存中讀取數據 DateTime dt = (DateTime)cache[CACHE_ITEM_NAME]; content = $"讀到 {dt.ToLongTimeString()}"; } else { // 如果緩存項不存在,或已過期 // 則重新把當前時間寫入緩存 DateTime dt = DateTime.Now; cache.Set(CACHE_ITEM_NAME, dt, DateTimeOffset.Now.AddSeconds(20)); content = $"讀到 {dt.ToLongTimeString()}"; }
這個例子也TMD簡單,就是把當前的時間放進緩存里面,並指定過期時間為20秒之后。如果緩存沒有過期,就從緩存里面讀取時間值,如果緩存項過期了或者不存在,就重新把當前時間寫入緩存。
具體效果如下圖。
從上面截圖中,你會看到,當緩存里的數據可用(20秒內進行讀取),每次所讀到的時間都是相同的。