iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 24
0

前言

本篇將介紹ASP.Net Core中MemoryCache的使用方式。

同步發表於個人點部落 - [鐵人賽Day24] ASP.Net Core MVC 進化之路 - MemoryCache

MemoryCache

MemoryCache適用於將不易變動的少量資料暫存於記憶體中,
藉此可以大幅改善Web應用程式的效能,
適用情境舉例如下:

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

ASP.Net CoreMemoryCache的使用方式非常簡單,
大部分還是搭配DI使用,
我們直接來進行實作。

首先在StartupConfigureServices中加上一行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()則可以設定記憶體的大小上限。

舉例來說,我們在方法一中設定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


上一篇
[鐵人賽Day23] - Entity Framework Core / Code First From Database
下一篇
[鐵人賽Day25] - Response Cache
系列文
菜鳥練等區-ASP.Net Core MVC進化之路30

尚未有邦友留言

立即登入留言