如何在 ASP.Net Core 使用 内存缓存

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

360浏览器5兼容模式吗_个独模式真能将企业总体税负降低至5%吗,为何大家都热衷核定征收...

个独模式真的能将企业总体税负降低至5%吗&#xff0c;为何大家都热衷选择申请核定征收企业性质不同&#xff0c;结构不同&#xff0c;体量不同&#xff0c;业务模式不同&#xff0c;自然纳税方式和税负也有差别。不同的纳税对象应该采取不同的节税方式&#xff0c;用合理合法的…

五年级计算机下册工作计划,五年级下学期工作计划

指导思想&#xff1a;五年级组2009年下学期工作计划是坚持"以人为本,以德为先"的宗旨,以课堂教学为阵地,以课改为中心工作,努力培养本年级学生良好的学习风尚,努力建设一支团结协作,努力进取,敢于创新的教师团队.年级情况&#xff0e;五年级组共有十名教师,其中四个班…

python3 for循环_从零开始学习PYTHON3讲义(六)for循环跟斐波那契数列

《从零开始PYTHON3》第六讲 几乎但凡接触过一点编程的人都知道for循环&#xff0c;在大多数语言的学习中&#xff0c;这也是第一个要学习的循环模式。 但是在Python中&#xff0c;我们把for循环放到了while循环的后面。原因是&#xff0c;Python中的for循环已经完全不是你知道的…

Yahoo Mail,慢功出细活〔转载〕

Yahoo Mail&#xff0c;慢功出细活2007年08月31日13:59 原文链接&#xff1a;http://chinese.wsj.com/gb/20070831/ptk141709.asp?sourcechannel用两年时间测试一款软件可真算费功夫&#xff0c;但雅虎公司(Yahoo! Inc.)开发完成新版本的电子邮箱软件Yahoo Mail就花了这么长…

浅谈如何理解领域驱动设计

本文作者为长沙.NET社区开发者微笑刺客&#xff0c;转载已获得作者授权。前言什么是领域&#xff0c;我习惯描述的是制药领域、环境领域、建筑领域、金融领域等&#xff0c;而在领域内&#xff0c;各种业务规则、业务知识盛行&#xff0c;如何有效的把控规则的变化&#xff0c;…

lol战绩查询接口_LOL:莫名其妙被封号?3把躺赢局被说是代打

Hello&#xff0c;大家好&#xff0c;这里是小皮说电竞&#xff0c;每天都会为大家带来LOL有趣的资讯&#xff0c;喜欢的话记得点个关注哦~英雄联盟已经发展至S10了&#xff0c;这么久以来&#xff0c;许多小伙伴都碰到过一个问题&#xff0c;那就是封号。封号的原因有很多&…

计算机cnc键代表啥,计算器上的cnc键表示啥

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。计算器上的cnc键代表清除。计算器是现代人发明的可以进行数字运算的电子机器。现代的电子计算器能进行数学运算的手持电子机器&#xff0c;拥有集成电路芯片&#xff0c;但结构比电脑…

apk源码查看工具_如何查看Linux命令工具的源码?

点击上方「嵌入式大杂烩」&#xff0c;「星标公众号」第一时间查看精彩文章&#xff01;上一篇分享了两个使用的小工具&#xff1a;《如何同时输出调试信息到终端及文件&#xff1f;》。有位小伙伴留言问道tee工具的代码在哪&#xff1a;这篇文章我们就来简单分享一下。首先&am…

final类是否可以被代理_浅谈Java【代理设计模式】——看这篇文章就懂了

什么是代理模式为其他对象提供一种代理以控制对这个对象的访问。为什么使用代理模式中介隔离&#xff1a;在某些情况下&#xff0c;一个客户类不想或者不能直接引用一个委托对象&#xff0c;而代理类对象可以在客户类和委托对象之间起到中介的作用&#xff0c;其特征是代理类和…

《The C++ Standard Library》第50页 关于传递auto_ptr的问题

第50页最后一段话: 我怎么没记得在第43页里说不能传递auto_ptr. 可是我在第43页没有找到”不要用任何方式来传递auto_ptr”类似的语句啊。 而且里面讲的是source和sink,说的就是该如何传递auto_ptr和转移auto_ptr的ownership啊。 倒是在第44页中找到了这样的话&#xff1a; 第4…

在.NET Core 中使用Quartz.NET

Quartz.NET是功能齐全的开源作业调度系统&#xff0c;可用于最小的应用程序到大型企业系统。Quartz.NET具有三个主要概念&#xff1a;•job&#xff1a;运行的后台任务•trigger&#xff1a;控制后台任务运行的触发器。•scheduler&#xff1a;协调job和triggerASP.NET Core通过…

北航计算机学院有河南的,北航计划在豫招生165人 河南多所高职公布预录名单...

今年河南省39所高职院校计划单独招生22452人&#xff0c;报名参加2013年高考的考生都可以参加。参加高职单招并被录取的考生&#xff0c;再参加高考。昨日&#xff0c;河南省多所院校已公布拟录取或录取名单。高职单招是授权高职院校独立组织录取的一种方式&#xff0c;必须于高…

EntityFramework Core如何映射动态模型?

【导读】本文我们来探讨下映射动态模型的几种方式&#xff0c;相信一部分童鞋项目有这样的需求&#xff0c;比如每天/每小时等生成一张表&#xff0c;此种动态模型映射非常常见&#xff0c;经我摸索&#xff0c;这里给出每一步详细思路&#xff0c;希望能帮助到没有任何头绪的童…

构建深度学习模型:原理与实践

构建深度学习模型&#xff1a;原理与实践 引言 随着人工智能技术的飞速发展&#xff0c;深度学习已经成为当今最为炙手可热的研究领域之一。深度学习通过模拟人脑神经网络的工作原理&#xff0c;使得计算机能够具备更强大的学习和识别能力。本文将深入探讨深度学习的基本原理…

petshop4.0 详解之五(PetShop之业务逻辑层设计)[转]

业务逻辑层&#xff08;Business Logic Layer&#xff09;无疑是系统架构中体现核心价值的部分。它的关注点主要集中在业务规则的制定、业务流程的实现等与业务需求有关的系统设计&#xff0c;也即是说它是与系统所应对的领域&#xff08;Domain&#xff09;逻辑有关&#xff0…

自建比赛服务器,《三国杀》怎么自己创建比赛?自建赛事规则介绍

你知道在三国杀怎么自己创建比赛吗&#xff1f;游戏真的有这个功能吗&#xff1f;下面就让我们一起来看看三国杀自建赛事规则介绍吧。三国杀在2.113版本更新中新增了赛事大厅功能&#xff0c;该玩法支持玩家自建比赛&#xff0c;可以建立"私密赛"和“公开赛”两种比赛…

地线与接地螺丝_电气接地规范与接地的各项参数

点击上方↑「老王和你聊电气」关注我吧电气接地规范1、适用范围&#xff1a;本规范规定了生产经营单位用电系统、新建扩建、检维修、改造、办公区域、员工宿舍等电气线路接地规定。2、术语和定义&#xff1a;电气系统配置保护方法有&#xff1a;保护接地、保护接零、重复接地、…

python中x_python中round(x,[n])的使用

round(x,[n]) 四舍五入 n保留小数部分个数 1、当不填写n时&#xff0c;默认为0&#xff0c;即不保留小数部分 a、当小数部分只为0.5时 整数部分如果为奇数则进1&#xff0c;如果为偶数则舍去小数部分 print(round(1.5))#2 小数部分为0.5 整数部分为奇数则1 print(round(2.5))#2…

如何在 Blazor WebAssembly中 使用 功能开关

微软Azure 团队开发的 功能管理 (Feature Management) 包 Microsoft.FeatureManagement可用于实现 功能开关&#xff0c;可以通过功能开关特性动态的改变应用程序的行为而不需要改变任何的业务逻辑代码。关于功能开关的更多功能请看Edi Wang的B站视频&#xff0c;长按小程序码进…

在Ajax程序中实现无刷新换肤功能(asp.net2.0)

写了一年多的WEB程序&#xff0c;觉得程序中换肤的功能是非常吸引人眼球的技术。特别是在子父级的WEB平台与论坛上应用广泛&#xff0c;可以突出不同人的风格与个性。从文章的标题上看是Ajax的无刷新换肤&#xff0c;只是本人比较喜欢Ajax程序而已&#xff0c;其实普通的WEB程序…