ASP.net Core
關於快取議題
大多數程式都會存取資料庫,隨者時間運作下資料存取次數和資料過多的狀況下,會讓回應開始出現延遲,通常會把資料存在快取中,在定時的更新,除了降低資料庫存取次數,同時可以加快回應速度。
快取分別有
- 記憶體快取
- 分散式快取
如何使用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
上述程式幾個重點。
- 上述的程式邏輯是在講的是當如果時間的快取為空if(now == null)部分,就寫入new快取,並回傳回去now。
- 等下次進來的時候,因為有快取的狀況下就會跑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上,加快資料存取速度。
元哥的筆記