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实现仍然是一个很好的解决方案,但应记住,数据恢复时将不会提供出色的性能,因此应谨慎选择要缓存的数据。
ASP.NET Core中的分布式缓存相关推荐
- ASP.NET Core中的Http缓存
ASP.NET Core中的Http缓存 Http响应缓存可减少客户端或代理对 web服务器发出的请求数.响应缓存还减少了 web服务器生成响应所需的工作量.响应缓存由 Http请求中的 header ...
- ASP.NET Core中的内存缓存
ASP.NET Core中的内存中缓存 让我们看看如何通过缓存优化ASP.NET Core应用程序性能 我相信,在我们的工作中,每个人都收到来自客户的请求或来自我们应用程序用户的反馈,以提高响应速度. ...
- 如何在 ASP.Net Core 中使用 NCache
虽然 ASP.Net Core 中缺少 Cache 对象,但它引入了三种不同的cache方式. 内存缓存 分布式缓存 Response缓存 Alachisoft 公司提供了一个开源项目 NCache, ...
- 在ASP.NET Core应用程序中使用分布式缓存
本文要点 ASP.NET Core内置了分布式缓存接口. 分布式缓存的主要好处有性能.数据共享和稳定性. Couchbase服务器是一个内存优先的数据库,非常适合作为分布式缓存. NuGet程序包使得 ...
- .ASP NET Core中缓存问题案例
本篇博客中,我将描述一个关于会话状态(Session State)的问题, 这个问题我已经被询问了好几次了. 问题的场景 创建一个新的ASP.NET Core应用程序 一个用户在会话状态中设置了一个字 ...
- Api网关Kong集成Consul做服务发现及在Asp.Net Core中的使用
1622219047536 写在前面 Api网关我们之前是用 .netcore写的 Ocelot的,使用后并没有完全达到我们的预期,花了些时间了解后觉得kong可能是个更合适的选择. 简单说下 ...
- 【半译】在ASP.NET Core中创建内部使用作用域服务的Quartz.NET宿主服务
在我的上一篇文章<在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度>,我展示了如何使用ASP.NET Core创建Quartz.NET托管服务并使用它来按计 ...
- 为什么我的会话状态在ASP.NET Core中不工作了?
原文:Why isn't my session state working in ASP.NET Core? Session state, GDPR, and non-essential cookie ...
- ASP.NET Core中间件实现分布式 Session(转载)
ASP.NET Core中间件实现分布式 Session 1. ASP.NET Core中间件详解 1.1. 中间件原理 1.1.1. 什么是中间件 1.1.2. 中间件执行过程 1.1.3. 中间件 ...
最新文章
- 多线程2(常用的方法:join、interrupt、currentThread、isAlive、setDaemon...)
- 深度学习理论与实战:基础篇电子书
- Asp.net mvc 2 in action 笔记 -2 View Controller
- 浏览器对于前端的作用
- 深入浅出python机器学习_4.3.2_岭回归的参数调节-2_绘制折线图
- C#中使用Path、Directory、Split、Substring实现对文件路径和文件名的常用操作实例
- C# 默认接口方法更新完成,很多细节问题尚待解决
- java文件端点续传效果图_Java单依赖性Dockerized HTTP端点
- Python教学与学习过程中应注意的九句话
- 春Phone计划 51cto沙龙上海站
- 写python代码案例_keras topN显示,自编写代码案例
- 设计模式14——行为型模式之职责链模式
- PHP中面向对象分析设计的经验总结
- 超好用的录屏软件 captura
- 项目管理:如何做好进度管理?
- 【SequoiaDB|巨杉数据库】巨杉数据库快速入门
- 计算机安装系统后鼠标无法使用,电脑重装系统后鼠标键盘不能用怎么办,鼠标键盘不能用解决方法...
- mysql预处理stmt_mysqli_stmt类:使用预处理语句处理SELECT查询结果
- 数学_余弦距离不满足三角不定式简单证明
- office2016简体中文版