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中的分布式缓存相关推荐

  1. ASP.NET Core中的Http缓存

    ASP.NET Core中的Http缓存 Http响应缓存可减少客户端或代理对 web服务器发出的请求数.响应缓存还减少了 web服务器生成响应所需的工作量.响应缓存由 Http请求中的 header ...

  2. ASP.NET Core中的内存缓存

    ASP.NET Core中的内存中缓存 让我们看看如何通过缓存优化ASP.NET Core应用程序性能 我相信,在我们的工作中,每个人都收到来自客户的请求或来自我们应用程序用户的反馈,以提高响应速度. ...

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

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

  4. 在ASP.NET Core应用程序中使用分布式缓存

    本文要点 ASP.NET Core内置了分布式缓存接口. 分布式缓存的主要好处有性能.数据共享和稳定性. Couchbase服务器是一个内存优先的数据库,非常适合作为分布式缓存. NuGet程序包使得 ...

  5. .ASP NET Core中缓存问题案例

    本篇博客中,我将描述一个关于会话状态(Session State)的问题, 这个问题我已经被询问了好几次了. 问题的场景 创建一个新的ASP.NET Core应用程序 一个用户在会话状态中设置了一个字 ...

  6. Api网关Kong集成Consul做服务发现及在Asp.Net Core中的使用

     1622219047536 写在前面   Api网关我们之前是用 .netcore写的 Ocelot的,使用后并没有完全达到我们的预期,花了些时间了解后觉得kong可能是个更合适的选择. 简单说下 ...

  7. 【半译】在ASP.NET Core中创建内部使用作用域服务的Quartz.NET宿主服务

    在我的上一篇文章<在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度>,我展示了如何使用ASP.NET Core创建Quartz.NET托管服务并使用它来按计 ...

  8. 为什么我的会话状态在ASP.NET Core中不工作了?

    原文:Why isn't my session state working in ASP.NET Core? Session state, GDPR, and non-essential cookie ...

  9. ASP.NET Core中间件实现分布式 Session(转载)

    ASP.NET Core中间件实现分布式 Session 1. ASP.NET Core中间件详解 1.1. 中间件原理 1.1.1. 什么是中间件 1.1.2. 中间件执行过程 1.1.3. 中间件 ...

最新文章

  1. 多线程2(常用的方法:join、interrupt、currentThread、isAlive、setDaemon...)
  2. 深度学习理论与实战:基础篇电子书
  3. Asp.net mvc 2 in action 笔记 -2 View Controller
  4. 浏览器对于前端的作用
  5. 深入浅出python机器学习_4.3.2_岭回归的参数调节-2_绘制折线图
  6. C#中使用Path、Directory、Split、Substring实现对文件路径和文件名的常用操作实例
  7. C# 默认接口方法更新完成,很多细节问题尚待解决
  8. java文件端点续传效果图_Java单依赖性Dockerized HTTP端点
  9. Python教学与学习过程中应注意的九句话
  10. 春Phone计划 51cto沙龙上海站
  11. 写python代码案例_keras topN显示,自编写代码案例
  12. 设计模式14——行为型模式之职责链模式
  13. PHP中面向对象分析设计的经验总结
  14. 超好用的录屏软件 captura
  15. 项目管理:如何做好进度管理?
  16. 【SequoiaDB|巨杉数据库】巨杉数据库快速入门
  17. 计算机安装系统后鼠标无法使用,电脑重装系统后鼠标键盘不能用怎么办,鼠标键盘不能用解决方法...
  18. mysql预处理stmt_mysqli_stmt类:使用预处理语句处理SELECT查询结果
  19. 数学_余弦距离不满足三角不定式简单证明
  20. office2016简体中文版

热门文章

  1. 【代码审计】PHP代码审计---基础记录
  2. 查看MySQL的当前日期
  3. 关于visual studio类视图和资源视图不显示类和资源的问题
  4. excel if in函数_【Excel函数】Small+Index+IF 一对N返回
  5. ipad和iphone切图_如何在iPhone,iPad和Mac上签名PDF
  6. 香港连续25年被评为全球最自由经济体
  7. WPF 获取鼠标屏幕位置、窗口位置、控件位置
  8. javaweb学习中的路径问题
  9. command not found Operation not permitted
  10. Android STL PORT