本篇將介紹ASP.Net Core中MemoryCache的使用方式。
MemoryCache適用於將不易變動的少量資料暫存於記憶體中,
藉此可以大幅改善Web應用程式的效能,
適用情境舉例如下:
- 火車當日的班次時間
- 線上測驗系統的當日題庫
在ASP.Net Core中MemoryCache的使用方式非常簡單,
大部分還是搭配DI使用,
在使用MemoryCache時官方有幾點提醒事項:
- 千萬不要使用前端input的欄位當作[MemoryCache_Key]。
- 使用Cache要記得設定時限,避免沒用到的資料繼續殘留。
- 要設定MemoryCache的記憶體上限(使用
SetSize()
)
我們直接來進行實作。
首先在Startup的ConfigureServices
中加上一行Code。
public void ConfigureServices(IServiceCollection services)
{
//只要這行就可以了
services.AddMemoryCache();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
只要設定完這行,
就可以在程式中使用DI進行注入了!
在ASP.Net Core中會使用IMemoryCache當作注入對象。
我們拿Home/Index做為範例。
public class HomeController : Controller
{
private readonly IMemoryCache memoryCache;
public HomeController(IMemoryCache _memoryCache)
{
this.memoryCache = _memoryCache;
}
}
注入完成後來做點測試
public IActionResult Index()
{
DateTime cacheEntry;
if (!memoryCache.TryGetValue("lastSaveTime", out cacheEntry))
{
cacheEntry = DateTime.Now;
// 方法一:比較[現在呼叫時間] - [上次呼叫時間]差異
var cacheEntryOptions = new MemoryCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromSeconds(10))
.SetSize(1024);
memoryCache.Set("lastSaveTime", cacheEntry, cacheEntryOptions);
//方法二:比較[現在呼叫時間] - [建立時間]差異
//memoryCache.Set("lastSaveTime", cacheEntry, TimeSpan.FromSeconds(10));
}
ViewData["cacheEntry"] = cacheEntry;
return View();
}
透過MemoryCacheEntryOptions
可調整快取相關的設定,
而透過SetSize()
則可以設定記憶體的大小上限。
方法一與方法二寫法看似沒有差異,
但實際上完全天差地遠。
方法一的SlidingExpiration
表示的是「與最後一次呼叫時間」的差異,
而方法二AbsoluteExpirationRelativeToNow
則比較像是「倒數計時」的概念。
舉例來說,我們在方法一中設定10秒,
只要這10秒內還有人跟MemoryCache拿取lastSaveTime,
最後一次時間就會一直更新。
但方法二中只要值一被設定完就開始倒數,
10秒後就會自動將lastSaveTime從MemoryCache移除。
另外在使用MemoryCache時,
官方建議將鍵值(Key)部分抽出獨立成一個static class,
避免在使用的過程中手誤打錯而取不到值XD。
範例程式如下:
public static class MemoryCacheKey
{
public static string LastSaveTime = "LastSaveTime";
public static string FirstSaveTime = "FirstSaveTime";
}
程式碼比較如下:
memoryCache.Set("lastSaveTime", cacheEntry, cacheEntryOptions);
memoryCache.Set(MemoryCacheKey.LastSaveTime, cacheEntry, cacheEntryOptions);
MemoryCache的介紹就先到這邊,
有錯誤的部分再麻煩大家指正
參考
https://docs.microsoft.com/zh-tw/aspnet/core/performance/caching/memory?view=aspnetcore-2.1