[鐵人賽Day24] ASP.Net Core MVC 進化之路 - MemoryCache

本篇將介紹ASP.Net CoreMemoryCache的使用方式。

 

 

MemoryCache適用於將不易變動的少量資料暫存於記憶體中,

藉此可以大幅改善Web應用程式的效能,

適用情境舉例如下:

  • 火車當日的班次時間
  • 線上測驗系統的當日題庫

 

ASP.Net CoreMemoryCache的使用方式非常簡單,

大部分還是搭配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秒後就會自動將lastSaveTimeMemoryCache移除。

 

另外在使用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