ASP.NET Core 是一個輕量級,模塊化的框架,經常使用來在 Windows,Linux 和 MacOS 上構建高性能,現代化的web框架,不像過去的 Asp.NET,在 ASP.NET Core 中並無內置 Cache 對象,不過你能夠經過 nuget 上的擴展實現以下三種 cache:html
in-memory cachingweb
distributed caching緩存
response cachingapp
在本文中,咱們來看看如何將那些不易變的數據灌到內存中實現 ASP.NET Core application 的高性能,而後我會用一些例子來講明這些概念。框架
如何啓用 in-memory cache
要想將 in-memory cache
集成到 ASP.NET Core 中,就須要將其注入到 ServiceCollection 容器,以下代碼所示:異步
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddMemoryCache(); }
集成好以後,接下來了解一下緩存的統一接口:IMemoryCache ,代碼以下:模塊化
public interface IMemoryCache : IDisposable { bool TryGetValue(object key, out object value); ICacheEntry CreateEntry(object key); void Remove(object key); }
那如何在 Controller 中使用呢?可使用 Controller 的構造函數實現注入,以下代碼所示:函數
public class HomeController : Controller { private readonly ILogger<HomeController> _logger; private IMemoryCache cache; public HomeController(ILogger<HomeController> logger, IMemoryCache cache) { _logger = logger; } }
到如今爲止,in-memory caching 的配置所有作完,如今能夠考慮如何實現從 Cache 讀取和寫入了。性能
Cache的讀取和寫入
利用 IMemoryCache 接口的 Set<T>()
可實現向緩存中寫入數據,請注意這個 Set<T>()
方法接收兩個參數,第一個參數是緩存的名字,第二個參數就是你要緩存的內容,以下代碼所示:this
public IActionResult Index() { cache.Set("IDGKey", DateTime.Now.ToString()); return View(); }
從 Cache 中提取內容,須要使用 IMemoryCache 接口的 TryGet()
方法,下面是對 Index 方法的一個修改版本,代碼以下:
public IActionResult Index() { string key = "IDGKey"; string obj; if (!cache.TryGetValue<string>(key, out obj)) { obj = DateTime.Now.ToString(); cache.Set<string>(key, obj); } ViewBag.Cache = obj; return View(); }
還有一個叫作 GetOrCreate
方法,從名字上就能看出來,若是獲取不到就會建立一個,以下代碼所示:
public IActionResult Index() { cache.GetOrCreate<string>("IDGKey", cacheEntry => { return DateTime.Now.ToString(); }); return View(); }
對了,除了同步版本的 GetOrCreate
,還有一個支持異步的 GetOrCreateAsync
。
Cache 的過時策略
能夠對緩存數據指定過時策略,好比說:絕對過時時間
和 滑動過時時間
,前者表示緩存數據的絕對存活時間,時間一到就會當即移除,後者表示指定的時間間隔內數據沒有被訪問到,那麼就會被移除,若是不明白的化,參考 Session 的過時機制。
要想設置過時策略,能夠經過 MemoryCacheEntryOptions
類來配置,以下代碼所示:
public IActionResult Index() { MemoryCacheEntryOptions cacheExpirationOptions = new MemoryCacheEntryOptions(); cacheExpirationOptions.AbsoluteExpiration = DateTime.Now.AddMinutes(30); cacheExpirationOptions.Priority = CacheItemPriority.Normal; cache.Set<string>("IDGKey", DateTime.Now.ToString(), cacheExpirationOptions); return View(); }
值得注意的是上面的 Priority
屬性,它的應用場景是這樣的,當應用程序內存不夠時要回收內存的過程當中,誰的優先級低就會被優先移除,除了Normal 枚舉,還有其餘諸如:Low, High, NeverRemove
,除了 NeverRemove
,其餘的幾種都會被回收機制管控。
新的 Cache 機制還提供了一個????????的方式,那就是 回調函數
注入,意味着當 cache 過時被移除時會自動觸發你指定的回調函數,你能夠在 回調函數
中作一些你自定義的業務邏輯,好比從新給 cache 注入值,以下代碼所示:
public IActionResult Index() { MemoryCacheEntryOptions cacheExpirationOptions = new MemoryCacheEntryOptions(); cacheExpirationOptions.RegisterPostEvictionCallback((obj1, obj2, reason, obj3) => { //callback }, this); cache.Set<string>("IDGKey", DateTime.Now.ToString(), cacheExpirationOptions); return View(); }
你甚至還能夠配置兩個 cache 的依賴關係,舉個例子,若是某一個 cache item
被移除了,你但願它關聯的 cache 也要自動移除,看起來是否是很 nice,篇幅有限,我會在後面的文章中和你們闡述如何去實現,若是你很想知道,可先參考微軟的MSDN:https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-5.0
譯文連接:https://www.infoworld.com/article/3230129/how-to-use-in-memory-caching-in-aspnet-core.html?nsdr=true