快取可以藉由減少產生內容所需的工作,大幅改善應用程式的效能和擴充性。快取最適合用於不常變動 且 產生成本較高的資料。快取會建立資料的複本,而這些資料的傳回速度會比來源快許多。應用程式應該撰寫和測試,永遠不依賴快取的資料。
ASP.NET Core 支援數個不同的快取。 最簡單的快取是以 IMemoryCache為基礎。 IMemoryCache 表示儲存在 web 伺服器記憶體中的快取。
在ASP.NET Core當中,可以透過DI的方式取得IMemoryCache
以下範例透過使用IMemoryCache來實踐本機快取的機制:
首先在Starup.ConfigureServices
註冊MemoryCache的服務
services.AddMemoryCache();
建立一個MemoryCacheController
,並加入Action
Route("api/[controller]")]
[ApiController]
public class MemoryCacheController : ControllerBase
{
private IMemoryCache _cache { get; set; }
public MemoryCacheController(IMemoryCache memoryCache)
{
_cache = memoryCache;
}
[HttpGet("")]
public ActionResult<Dictionary<string, string>> Get()
{
DateTime cacheEntry;
// 嘗試取得指定的Cache
if (!_cache.TryGetValue("CachKey", out cacheEntry))
{
// 指定的Cache不存在,所以給予一個新的值
cacheEntry = DateTime.Now;
// 設定Cache選項
var cacheEntryOptions = new MemoryCacheEntryOptions()
// 設定Cache保存時間,如果有存取到就會刷新保存時間
.SetSlidingExpiration(TimeSpan.FromSeconds(60));
// 把資料除存進Cache中
_cache.Set("CachKey", cacheEntry, cacheEntryOptions);
}
return new Dictionary<string, string>()
{
{"現在時間", DateTime.Now.ToString()},
{"快取內容", cacheEntry.ToString()}
};
}
}
上面範例可看到,快取是由Key/Value所組成的,Value可以塞入任意型別的資料(包括類別),透過善用快取,可以有效的提升網站的效能,節省部分存取的資源。
當網站有多個站台,且這些站都需要共用同一份快取資料的時候,就需要使用分散式快取,分散式快取是由多個應用程式伺服器所共用的快取,通常會以外部服務的形式維護給存取它的應用程式伺服器。分散式快取可以改善 ASP.NET Core 應用程式的效能和擴充性。
分散式快取有以下優點:
在ASP.NET Core中會透過實作IDistributedCache介面來對分散式快取進行操作,提供實作IDistributedCache的分散式架構有包括
Redis 是一種開放原始碼的記憶體內部資料存放區,通常用來做為分散式快取。
在使用ASP.NET Core存取Redis前,必須得先進行安裝,可以從官網下載並安裝。
以下介紹如何在ASP.NET Core中使用Redis快取
首先透過.NET CLI的指令在專案下安裝nuget套件
dotnet add package Microsoft.Extensions.Caching.Redis
接著在Startup.ConfigureServices
加入
services.AddDistributedRedisCache(options =>
{
options.Configuration = ""; //這邊輸入Redis Server的IP:Port
});
接著將IDistributedCache
注入到要使用的類別中就能夠使用了IDistributedCache
提供了以下方法來操作分散式快取:
IDistributedCache
的 GET/SET 不像是IMemoryCache
可以存取任意型別,只能存取byte[]
型別,所以如果要將資料存入Redis(或是其他分散式快取),就必須把型別轉為byte[]
。
參考資料
Distributed caching in ASP.NET Core