如何在 ASP.Net Core 使用 内存缓存
ASP.NET Core 是一個輕量級,模塊化的框架,常用來在 Windows,Linux 和 MacOS 上構(gòu)建高性能,現(xiàn)代化的web框架,不像過去的 Asp.NET,在 ASP.NET Core 中并沒有內(nèi)置 Cache 對象,不過你可以通過 nuget 上的擴展實現(xiàn)如下三種 cache:
in-memory caching
distributed caching
response caching
在本文中,我們來看看如何將那些不易變的數(shù)據(jù)灌到內(nèi)存中實現(xiàn) ASP.NET Core application 的高性能,然后我會用一些例子來說明這些概念。
如何啟用 in-memory cache
要想將 in-memory cache 集成到 ASP.NET Core 中,就需要將其注入到 ServiceCollection 容器,如下代碼所示:
public?void?ConfigureServices(IServiceCollection?services) {services.AddMvc();services.AddMemoryCache(); }集成好之后,接下來了解一下緩存的統(tǒng)一接口:IMemoryCache ,代碼如下:
public?interface?IMemoryCache?:?IDisposable {bool?TryGetValue(object?key,?out?object?value);ICacheEntry?CreateEntry(object?key);void?Remove(object?key); }那如何在 Controller 中使用呢?可以使用 Controller 的構(gòu)造函數(shù)實現(xiàn)注入,如下代碼所示:
public?class?HomeController?:?Controller{private?readonly?ILogger<HomeController>?_logger;private?IMemoryCache?cache;public?HomeController(ILogger<HomeController>?logger,?IMemoryCache?cache){_logger?=?logger;}}到現(xiàn)在為止,in-memory caching 的配置全部做完,現(xiàn)在可以考慮如何實現(xiàn)從 Cache 讀取和寫入了。
Cache的讀取和寫入
利用 IMemoryCache 接口的 Set<T>() 可實現(xiàn)向緩存中寫入數(shù)據(jù),請注意這個 Set<T>() 方法接收兩個參數(shù),第一個參數(shù)是緩存的名字,第二個參數(shù)就是你要緩存的內(nèi)容,如下代碼所示:
public?IActionResult?Index(){cache.Set("IDGKey",?DateTime.Now.ToString());return?View();}從 Cache 中提取內(nèi)容,需要使用 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 方法,從名字上就能看出來,如果獲取不到就會創(chuàng)建一個,如下代碼所示:
public?IActionResult?Index(){cache.GetOrCreate<string>("IDGKey",?cacheEntry?=>{return?DateTime.Now.ToString();});return?View();}對了,除了同步版本的 GetOrCreate,還有一個支持異步的 GetOrCreateAsync。
Cache 的過期策略
可以對緩存數(shù)據(jù)指定過期策略,比如說:絕對過期時間 和 滑動過期時間,前者表示緩存數(shù)據(jù)的絕對存活時間,時間一到就會立即移除,后者表示指定的時間間隔內(nèi)數(shù)據(jù)沒有被訪問到,那么就會被移除,如果不明白的化,參考 Session 的過期機制。
要想設(shè)置過期策略,可以通過 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 屬性,它的應(yīng)用場景是這樣的,當(dāng)應(yīng)用程序內(nèi)存不夠時要回收內(nèi)存的過程中,誰的優(yōu)先級低就會被優(yōu)先移除,除了Normal 枚舉,還有其他諸如:Low, High, NeverRemove ,除了 NeverRemove ,其他的幾種都會被回收機制管控。
新的 Cache 機制還提供了一個????????的方式,那就是 回調(diào)函數(shù) 注入,意味著當(dāng) cache 過期被移除時會自動觸發(fā)你指定的回調(diào)函數(shù),你可以在 回調(diào)函數(shù) 中做一些你自定義的業(yè)務(wù)邏輯,比如重新給 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 的依賴關(guān)系,舉個例子,如果某一個 cache item 被移除了,你希望它關(guān)聯(lián)的 cache 也要自動移除,看起來是不是很 nice,篇幅有限,我會在后面的文章中和大家闡述如何去實現(xiàn),如果你很想知道,可先參考微軟的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
總結(jié)
以上是生活随笔為你收集整理的如何在 ASP.Net Core 使用 内存缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET5实战千万并发,性能碾压各版本,
- 下一篇: 在.NET Core 中使用Quartz