ASP.NET Core MemoryCache

ASP.net Core

關於快取議題

大多數程式都會存取資料庫,隨者時間運作下資料存取次數和資料過多的狀況下,會讓回應開始出現延遲,通常會把資料存在快取中,在定時的更新,除了降低資料庫存取次數,同時可以加快回應速度。

快取分別有

  1. 記憶體快取
  2. 分散式快取

如何使用MemoryCache

安裝Microsoft.Extensions.Caching.Memory套件

在Program.cs進行註冊

builder.Services.AddMemoryCache();

建構子注入

        private IMemoryCache _memoryCache { get; set; }

        public MemoryCacheController(IMemoryCache memoryCache)
        {
            _memoryCache = memoryCache;
        }

時間為例用法

        
        [HttpGet]
        public ResponseVM<string> GetNow()
        {
            var response = new ResponseVM<string>();
            var now = _memoryCache.Get<string>("now");
            if (now == null)  
            {
                now = DateTime.Now.ToString();
                _memoryCache.Set("now", now);
                return response.Success(now);
            }
            else
            {
                return response.Success(now);
            }

        }

關於GetNow上述程式幾個重點。

  1. 上述的程式邏輯是在講的是當如果時間的快取為空if(now == null)部分,就寫入new快取,並回傳回去now。
  2. 等下次進來的時候,因為有快取的狀況下就會跑Else的區段,將快取時間Response回傳回去。

 

假設有一個情境要降低資料Loading如例子如下:

    public class CategoryService:ICategoryService
    {
        private readonly ICategoryRepository _categoryRepository;
        private readonly IMemoryCache _memoryCache;

        public CategoryService(ICategoryRepository categoryRepository, IMemoryCache memoryCache)
        {
            _categoryRepository = categoryRepository;
            _memoryCache = memoryCache;
        }

        public ResponseVM<List<ResponseCategoryVM>> GetCategorys()
        {
            var response = new ResponseVM<List<ResponseCategoryVM>>();
            var cacheCategorys = _memoryCache.Get<List<ResponseCategoryVM>>("categorys");
            if (cacheCategorys == null)
            {
                var result = _categoryRepository.GetAll();
                if (!result.Any())
                    return response.Fail(ResponseCode.NotFound);
                
                cacheCategorys = result.Select(x => new ResponseCategoryVM()
                {
                    Id = x.Id,
                    SubId = x.SubId,
                    Name = x.Name
                }).ToList();
                _memoryCache.Set("categorys", cacheCategorys, TimeSpan.FromMinutes(60));
            }
          
            return response.Success(cacheCategorys);
        }

在上述的例子的時候將撈取資料放在Cache上進行儲存,在下一次載入的時候,直接透過Get資料回傳到Response上,加快資料存取速度。

 

元哥的筆記