平時開發程序時,中大型項目都是使用Redis緩存,但在一些較小的項目中,則使用運行時緩存,由.NET FRAMEWORK 提供,命名空間System.Runtime.Caching。
在下基礎不太好,對緩存這塊從未深究,只認為可以達到預想中的目標就夠了,所以平時基本都是逐漸摸索。
近來,開發一個交警內部使用的管理系統,要求減少讀取數據庫,並且每個用戶的數據必須是隔離的。這需要用到緩存。使用過程中有個疑問,運行時緩存是將對象拷貝一份保存起來,還是修改對象的內存策略。
平時比較忙,今天恰好有點時間,寫了一個測試來驗證我的猜想,從來沒人說過或是哪裡講過這塊知識,現在分享給其他可能同樣有疑問的同學。
先貼下我寫的測試類,如果有哪個地方會導致結果不太准確,請指出:
// 用於緩存的類 public class CacheEntity { public Guid Guid { get; set; } public int State { get; set; } public DateTime CachedOn { get; set; } public string Desc { get; set; } public override string ToString() { return $"Object[{this.Guid}] State: [{State}] CachedOn:[{CachedOn}] Desc:[{Desc}]."; } }
// 獲得即將緩存的對象 protected virtual CacheEntity GetTestCacheEntity() { return new CacheEntity { Guid = Guid.NewGuid(), CachedOn = DateTime.Now, Desc = "初始化", State = 1 }; } // 獲得測試使用的緩存策略 protected virtual ICacheManager GetTestCacheManager() { return new MemoryCacheManager(); }
接下來就是測試方法。
/// <summary> /// 驗證猜想, 緩存數據, 是重新定義對象在內存中的保存策略. /// 並不是拷貝一份副本進行緩存, 而是將內存中的對象延遲銷毀. /// </summary> [Test] public void Valid_mind() { var originalEntity = GetTestCacheEntity(); var cacheManager = GetTestCacheManager(); var cacheKey = "CacheEntity"; cacheManager.Set(cacheKey, originalEntity, 5); cacheManager.IsSet(cacheKey).ShouldBeTrue(); Console.WriteLine($"{DateTime.Now}: Get cache..."); var cacheEntity = cacheManager.Get<CacheEntity>(cacheKey); cacheEntity.Guid.ShouldEqual(originalEntity.Guid); cacheEntity.State.ShouldEqual(originalEntity.State); cacheEntity.CachedOn.ShouldEqual(originalEntity.CachedOn); cacheEntity.Desc.ShouldEqual(originalEntity.Desc); Console.WriteLine(cacheEntity); Console.WriteLine($"{DateTime.Now}: Entity has been cache."); Console.WriteLine(); Console.WriteLine($"-------------------------------------"); Console.WriteLine(); Console.WriteLine($"{DateTime.Now}: Change Entity's data, and valid again."); cacheEntity.Guid = Guid.NewGuid(); cacheEntity.State = 2; cacheEntity.CachedOn = DateTime.Now; cacheEntity.Desc = "數據已更改"; Console.WriteLine($"{DateTime.Now}: Get cache again..."); cacheEntity = cacheManager.Get<CacheEntity>(cacheKey); Console.WriteLine(cacheEntity); Console.WriteLine($"{DateTime.Now}: Test ends."); }
在測試方法中,僅設置一次緩存,其他都是讀取該緩存。
下面是測試結果:
結論是:
運行時緩存更改了對象的內存存儲策略,這使得對象不被GC回收,在接下來的過程中可以再次使用。