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-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

如何在 ASP.Net Core 使用 内存缓存相关推荐

  1. 如何在 ASP.Net Core 使用 分布式缓存

    ASP.Net Core 提供了多种类型的缓存,除了内存缓存和响应缓存之外,还提供了对 分布式缓存 的支持.在之前的一篇文章中,我讨论了 ASP.Net Core 的内存缓存.在本文中,我们将讨论如何 ...

  2. 如何在 ASP.NET Core 中使用 LazyCache

    微软的 ASP.NET Core 已经是一个非常流行的用于构建 高性能, 模块化 并能运行在 Windows, Linux, MacOS 上的 WEB 框架,通常能够让程序保持高性能的一个有效途径就是 ...

  3. 如何在 ASP.Net Core 中使用 NCache

    虽然 ASP.Net Core 中缺少 Cache 对象,但它引入了三种不同的cache方式. 内存缓存 分布式缓存 Response缓存 Alachisoft 公司提供了一个开源项目 NCache, ...

  4. 如何在 ASP.NET Core 中使用 HttpClientFactory ?

    ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 HttpClientFactory. ...

  5. 如何在 ASP.Net Core 中使用 Configuration Provider

    ASP.NET Core 是一个开源的,跨平台的,精简的模块化框架,可用于构建高性能,可扩展的web应用程序, ASP.NET Core 中的数据配置常用 k-v 的形式存储,值得注意的是,新的数据配 ...

  6. 如何在 Asp.Net Core 实现 Excel 导出功能

    在web应用程序开发时,或许你会遇到这样的需求,如何在 Asp.Net Core 中实现 excel 或者 word 的导入导出,在 NuGet 上有大量的工具包可以实现这样的功能,本篇就讨论下如何使 ...

  7. 如何在 Asp.Net Core 中对请求进行限流

    译文链接:https://www.infoworld.com/article/3442946/how-to-implement-rate-limiting-in-aspnet-core.html 在应 ...

  8. 如何在ASP.NET Core程序启动时运行异步任务(3)

    原文:Running async tasks on app startup in ASP.NET Core (Part 3) 作者:Andrew Lock 译者:Lamond Lu 之前我写了两篇有关 ...

  9. 如何在ASP.NET Core程序启动时运行异步任务(2)

    原文:Running async tasks on app startup in ASP.NET Core (Part 2) 作者:Andrew Lock 译者:Lamond Lu 在我的上一篇博客中 ...

最新文章

  1. [SharePoint]ExcelService未响应或拒绝访问
  2. gitpython git diff_Python全栈开发-git常用命令
  3. 蓝桥杯小白系列之汇编点亮led灯
  4. 剑指Offer - 面试题9. 用两个栈实现队列
  5. 转:概述RAID磁盘的IOPS
  6. MyBatis源码解读之源码结构
  7. 基于模板的代码生成器
  8. 微信公众号 语音转文字api_快速上手——微信公众号开发接入
  9. C语言为内存分配空间(代码段、数据段、bss段、存储类、变量的生命周期)
  10. 你为什么需要认知升级?认知决定你的财富!
  11. 苹果ios按键精灵deb包旧版本1.3.8安装方法 --- checkra1n越狱版
  12. Access violation reading location 0x000000XX
  13. Python开发, 恶意病毒扫描
  14. 裸眼3D全息投影技术
  15. US Domain Center域名注册| 域名注册商
  16. GameFramework篇:StarForce资源加载细节讲解(一:资源加载辅助器)
  17. 数据库入门级学习(4)
  18. CPIM SRM考试通过
  19. MAPGIS-TDE 三维处理平台简介
  20. 【一分钱做公益】宝鸡上善公益为首批支付宝公益消费捐爱心商户集中授牌

热门文章

  1. Python基础学习总结__Day3
  2. 寻找kernel32.dll的地址
  3. hdu-5781 ATM Mechine(dp+概率期望)
  4. Shell 控制并发
  5. 解题报告 树形图计数
  6. InstallSield更新包快速入门文档----感谢原作者ㄣ齊¨彡仯乄的无私提供
  7. 会议中的Meeting App
  8. 启动物联网智能校园,NFC技术可变出哪些创新应用?
  9. ssh公钥免密码登录
  10. 第一个c++泛型函数(即模板)