ASP.NET Core中的分布式缓存

ASP.NET Core中的分布式缓存

在上一篇文章中[1],我解释了如何使用内存缓存在ASP.NET Core应用程序中管理缓存。如果您的应用程序托管在单个服务器上,则可以使用这种类型的缓存。那.NET Core框架可以使用哪些工具在云中的分布式方案中进行缓存呢

IDistributedCache接口

该框架提供以下接口:

public interface IDistributedCache
{byte[] Get(string key);Task <byte[]> GetAsync(string key);void Set(string key, byte[] value, DistributedCacheEntryOptions options);Task SetAsync(string key, byte[] value, DistributedCacheEntryOptions options);void Refresh(string key);Task RefreshAsync(string key);void Remove(string key);Task RemoveAsync(string key);}

如果您还记得上一篇文章(IMemoryCache)中使用的接口,则可能会注意到一些相似之处,但甚至有很多区别,例如:

1.异步方法2.刷新方法(无需请求数据即可更新缓存键)3.基于字节而非基于对象的方法

到目前为止,Microsoft提供了3种实现:一种是内存中的,主要用于应用程序的开发阶段,第二种是在SQL Server上,最后一种是基于REDIS

要使用基于REDIS的版本,必须安装NuGet软件包Microsoft.Extensions.Caching.Redis

分布式内存缓存

该实现由框架提供,并将我们的数据保存在内存中。它不是完全分布式的缓存,因为数据是从应用程序实例保存在其所在的服务器上的。在某些情况下可能会有用:

•开发与测试•在生产中使用单个服务器时,内存消耗不是问题。

无论如何,我们将使我们的应用程序仅在必要时才使用“真实的”分布式解决方案(用于保存的接口是相同的)。要启用此IDistributedCache实现,您只需要在Startup类中注册它,如下所示:

`services.AddDistributedMemoryCache();`

分布式SQL Server缓存

此实现使分布式缓存可以将SQL Server数据库用作存储。有一些配置步骤。第一步包括创建用于保留数据的表。有一个命令行命令工具,可通过简单的指令轻松实现

dotnet sql-cache create <connection string > <schema > <table >

允许创建具有以下结构的表:

CREATE TABLE [dbo].[CacheTable]([Id] [nvarchar](449) NOT NULL,[Value] [varbinary](max) NOT NULL,[ExpiresAtTime] [datetimeoffset](7) NOT NULL,[SlidingExpirationInSeconds] [bigint] NULL,[AbsoluteExpiration] [datetimeoffset](7) NULL,CONSTRAINT [pk_Id] PRIMARY KEY CLUSTERED 
([Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]CREATE NONCLUSTERED INDEX [Index_ExpiresAtTime] ON [dbo].[CacheTable]
([ExpiresAtTime] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

配置此实现的第二个也是最后一个步骤,即在我们的应用程序中进行注册。在Startup类的ConfigureServices方法内,我们添加以下代码块:

services.AddDistributedSqlServerCache(o =>
{o.ConnectionString = Configuration["ConnectionStrings:Default"];o.SchemaName = "dbo";o.TableName = "Cache";
});

分布式Redis缓存

在分布式缓存场景中,Redis的使用非常广泛。Redis是一个快速存储的数据存储,它是开源的并且是键值类型。它提供的响应时间不到1毫秒,从而允许在各个领域中的每个实时应用程序每秒接收数百万个请求。如果您的应用程序的基础结构基于Azure云,则可以使用服务Azure Redis缓存,并且可以从您的订阅中对其进行配置。

要在Redis上使用分布式缓存,必须安装软件包Microsoft.Extensions.Caching.Redis。第一步是在Startup.class中配置服务?[6]

public void ConfigureServices(IServiceCollection services)
{// Add framework services.// ... altri servizi ...services.AddDistributedRedisCache(cfg => {cfg.Configuration = Configuration.GetConnectionString("redis");});
}

如果使用的是Azure Redis缓存,则可以通过访问面板的“访问键”部分找到连接字符串。

如何使用IDistributedCache

接口IDistributedCache的使用特别简单:如果您已经阅读了有关接口IMemoryCache的使用的文章,那么您将在命令中找到几点。如果要在控制器中使用它,则需要首先将实例注入构造函数中,如下面的代码所示:

public class HomeController : Controller
{private readonly IDistributedCache _cache;public HomeController(IDistributedCache cache){_cache = cache;}public async Task <IActionResult > Index(){await _cache.SetStringAsync("TestString", "TestValue");var value = _cache.GetString("TestString");return View();}
}

如果让此代码运行,并在Index方法的最后一行插入一个断点,则会得到以下结果:

我们可以使用DistributedCacheEntryOptions类轻松检查缓存的持续时间。在下面的代码中,我们创建一个实例,将持续时间设置为一小时。

public async Task <IActionResult > Index()
{var options = new DistributedCacheEntryOptions{AbsoluteExpiration = DateTime.Now.AddHours(1)};await _cache.SetStringAsync("TestString", "TestValue", options);var value = _cache.GetString("TestString");return View();
}

‍结论与建议

在我们的应用中使用哪种IDistributedCache实现的决定取决于某些因素。在Redis和SQL之间进行选择(我将内存实现仅保留在测试和开发中,所以我将其保留在外)应该基于对您可用的基础结构,性能要求和开发团队的经验进行选择。

如果团队对Redis感到放心,这将是最佳选择。SQL实现仍然是一个很好的解决方案,但应记住,数据恢复时将不会提供出色的性能,因此应谨慎选择要缓存的数据。

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

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

相关文章

marquee滚动起始位置_巧用喵影关键帧制作滚动水印,让视频小偷无可盗

视频创作者最奔溃瞬间&#xff0c;不是翻遍了所有网站还找不到合适的素材&#xff0c;也不是作品快完成了却发现电脑死机&#xff0c;而是自己呕心沥血做出来的视频被盗了&#xff0c;结果盗版视频的播放量还更高&#xff01;&#xff01;​理想的解决方法就是给视频打上水印。…

.NET Core + K8S + Loki 玩转日志聚合

Grafana loki1. Intro最近在了解日志聚合系统&#xff0c;正好前几天看到一篇文章《用了日志系统新贵Loki&#xff0c;ELK突然不香了&#xff01;》&#xff0c;所以就决定动手体验一下。本文就带大家快速了解下Loki&#xff0c;并简单介绍.NET Core如何集成Loki。2. Whats Lok…

[Redis6]常用数据类型_Zset有序集合

Zset有序集合 简介 Redis有序集合zset与普通集合set非常相似&#xff0c;是一个没有重复元素的字符串集合。 不同之处是有序集合的每个成员都关联了一个评分&#xff08;score&#xff09;,这个评分&#xff08;score&#xff09;被用来按照从最低分到最高分的方式排序集合中…

css 旋转45_CSS教程——第14期

警告&#xff01;本期内容建议CSS基础良好的人看&#xff0c;本期为实战篇&#xff0c;难度有点大哈喽大家好我是wawjf灰常抱歉我们咕咕了快两周&#xff0c;主要原因是我们的几位作者(加上我其实就两个)去夏令营学习了某重要东西&#xff0c;所以没时间更新&#xff0c;在这里…

使用Azure Blob Storage实现一个静态文件服务器

什么是Azure Blob StorageAzure Blob Storage是微软Azure的对象存储服务。国内的云一般叫OSS&#xff0c;是一种用来存储非结构化数据的服务&#xff0c;比如音频&#xff0c;视频&#xff0c;图片&#xff0c;文本等等。用户可以通过http在全球任意地方访问这些资源。这些资源…

台湾RD技术谈|嘉宾郭家齊董大偉黃保翕

欢迎来到Azure Show!Azure Show欢迎来到Azure Show第四期&#xff0c;本期特辑是首次推出RD技术谈栏目&#xff0c;我们邀请了宝岛台湾的三位重量级嘉宾&#xff0c;保哥、Edward和董大伟三位老师&#xff0c;他们既是微软的最有价值专家&#xff0c;也是微软技术社区区域总监&…

ajax option请求后无post请求_ThingJS:一种浏览器、服务器和技术的新组合方法——Ajax...

Web应用是一种极大方便用户的操作界面&#xff0c;数据维护技术Ajax也从中脱颖而出&#xff0c;ThingJS采用了Ajax的数据维护能够形成轻量化的开发流程。为什么Ajax通过XHR 实现Ajax 通信的一个主要限制&#xff0c;来源于跨域安全策略。默认情况下&#xff0c;XHR 对象只能访问…

[Nginx]负载均衡和动静分离

负载均衡 客户端发送多个请求到服务器&#xff0c;服务器处理请求&#xff0c;有一些可能要与数据库进行交互&#xff0c;服务器处理完毕后&#xff0c;再将结果返回给客户端。 这种架构模式对于早期的系统相对单一&#xff0c;并发请求相对较少的情况下是比较适合的&#xff…

[Nginx]nginx常用的命令

nginx常用的命令 使用nginx操作命令前提条件:必须进入nginx的目录 cd /www/local/webserver/nginx/sbin查看nginx的版本号 ./nginx -v启动nginx ./nginx关闭nginx ./nginx -s stop重新加载nginx ./nginx -s reload

pc 图片预览放大 端vue_安利一款简单好用的Vue图片预览插件

在项目中因为要经常用到图片预览效果&#xff0c;自己写的话麻烦死啦(懒)vue-photo-preview一个基于 photoswipe 的 vue 图片预览插件&#xff0c;支持移动端和PC端&#xff0c;支持各种手势操作&#xff0c;放大缩小&#xff0c;体验流畅。gitHub: https://github.com/8263277…

[Nginx]nginx的配置文件

nginx配置文件 nginx配置文件位置 nginx配置文件由三部分组成 第一部分 全局块 从配置文件开始到 events 块之间的内容&#xff0c;主要会设置一些影响 nginx 服务器整体运行的配置指令&#xff0c;主要包括配置运行 Nginx 服务器的用户&#xff08;组&#xff09;、允许生成…

Abp vNext 二进制大对象系统(BLOB)

一、简介ABP vNext 在 v 2.9.x 版本当中添加了 BLOB 系统&#xff0c;主要用于存储大型二进制文件。ABP 抽象了一套通用的 BLOB 体系&#xff0c;开发人员在存储或读取二进制文件时&#xff0c;可以忽略具体实现&#xff0c;直接使用IBlobContainer 或 IBlobContainer<T>…

[Nginx]location 指令说明

location 指令说明 该指令用于匹配 URL。 语法如下&#xff1a; 1、 &#xff1a;用于不含正则表达式的 uri 前&#xff0c;要求请求字符串与 uri 严格匹配&#xff0c;如果匹配 成功&#xff0c;就停止继续向下搜索并立即处理该请求。 2、~&#xff1a;用于表示 uri 包含正则…

基于GitBook框架搭建技术文档平台

源宝导读&#xff1a;为了向用户更好的传递ERP开放平台的价值与技术知识&#xff0c;我们基于GitBook框架搭建了一个文档中心站点&#xff0c;本文将介绍此站点的设计与实现过程。一、项目架构图因为文档会涉及到很多的产品线&#xff0c;所以目前主要是通过拉取各个产品线的文…

[Nginx]nginx 配置实例-负载均衡

nginx 配置实例-负载均衡 1、实现效果 &#xff08;1&#xff09;浏览器地址栏输入地址 http://192.168.111.134/edu/a.html&#xff0c;负载均衡效果&#xff0c;平均分担到 8080和 8081 端口中 2、准备工作 &#xff08;1&#xff09;准备两台 tomcat 服务器&#xff0c;…

css3边框交替动画_用css3实现惊艳面试官的背景即背景动画(高级附源码)

我们传统的前端更多的是用javascript实现各种复杂动画&#xff0c;自从有了Css3 transition和animation以来,前端开发在动画这一块有了更高的自由度和格局,对动画的开发也越来越容易。这篇文章就让我们汇总一下使用Css3实现的各种特效。这篇文章参考《css揭秘》这本书&#xff…

用Blazor技术封装G2Plot实现Charts组件

Blazor是一个使用 .NET 生成交互式客户端 Web UI 的框架。目前社区刚起步&#xff0c;相关的组件并不多&#xff0c;有幸有一群爱好者正在努力建设社区&#xff0c;我作为社区一员也来贡献一些内容。这里我就分享分享我封装G2Plot后的Blazor组件ant-design-charts-blazor。ant-…

[Nginx]nginx配置实例_反向代理

nginx 配置实例-反向代理1 1、实现效果 &#xff08;1&#xff09;打开浏览器&#xff0c;在浏览器地址栏输入地址 www.123.com&#xff0c;跳转到 liunx 系统 tomcat 主页面中 2、准备工作 &#xff08;1&#xff09;在 liunx 系统安装 tomcat&#xff0c;使用默认端口 80…

lts安装 rust ubuntu_一起学Rust编程「1」:开发环境

引言Rust是近几年获得广泛关注和认可的一门系统级编程语言。它严苛的静态类型检查和独特的所有权系统&#xff0c;使得编译器能够尽可能的帮开发者在编译时就排除一些符合常见模式的bug。这也让很多人认为rust是一门更加“安全”的语言。专注数据安全技术的红小豆同学也非常看好…

使用 iPerf 测试 Azure VM 之间的网速

点击上方关注“汪宇杰博客” ^_^导语以往提到测网速&#xff0c;大家可能想到的都是用著名的 speedtest 等工具测试互联网连接速度。但实际上仅仅测试互联网连接速度并不可靠&#xff0c;在部分应用场景里网速还受到服务器之间的连接速度影响&#xff0c;因此清楚你的网络性能瓶…