关于.net:如何在-ASPNet-Core-使用-内存缓存

39次阅读

共计 2818 个字符,预计需要花费 8 分钟才能阅读完成。

ASP.NET Core 是一个轻量级,模块化的框架,罕用来在 Windows,Linux 和 MacOS 上构建高性能,现代化的 web 框架,不像过来的 Asp.NET,在 ASP.NET Core 中并没有内置 Cache 对象,不过你能够通过 nuget 上的扩大实现如下三种 cache:

  • in-memory caching
  • distributed caching
  • response caching

在本文中,咱们来看看如何将那些不易变的数据灌到内存中实现 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>() 办法接管两个参数,第一个参数是缓存的名字,第二个参数就是你要缓存的内容,如下代码所示:


        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…

译文链接:https://www.infoworld.com/art…

更多高质量干货:参见我的 GitHub: csharptranslate

正文完
 0