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