平時開發程序時,中大型項目都是使用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回收,在接下來的過程中可以再次使用。