ASP.NET Core 中的分布式缓存Distributed caching in ASP.NET Core

本文内容

作者: Mohsin NasirSteve Smith

分布式缓存是由多个应用服务器共享的缓存,通常作为外部服务在访问它的应用服务器上维护。分布式缓存可以提高 ASP.NET Core 应用程序的性能和可伸缩性,尤其是在应用程序由云服务或服务器场托管时。

与其他缓存方案相比,分布式缓存具有多项优势,其中缓存的数据存储在单个应用服务器上。

当分布式缓存数据时,数据将:

  • 跨多个服务器的请求具有连贯(一致)。
  • 置服务器重启和应用部署。
  • 不使用本地内存。

分布式缓存配置是特定于实现的。本文介绍如何配置 SQL Server 和 Redis 分布式缓存。第三方实现也可用,例如NCacheGitHub 上的 NCache)。无论选择哪种实现,应用都使用 IDistributedCache 接口与缓存交互。

查看或下载示例代码如何下载

必备条件Prerequisites

若要使用 SQL Server 分布式缓存,请将包引用添加到 "

若要使用 Redis 分布式缓存,请将包引用添加到StackExchangeRedis包。

若要使用 NCache 分布式缓存,请将包引用添加到NCache包。

IDistributedCache 接口IDistributedCache interface

IDistributedCache 接口提供以下方法来处理分布式缓存实现中的项:

  • GetGetAsync – 接受字符串键,并检索缓存项作为 byte[] 数组(如果在缓存中找到)。
  • SetSetAsync – 使用字符串键将项(作为 byte[] 数组)添加到缓存中。
  • Refresh中,RefreshAsync – 基于其键刷新缓存中的项,并重置其可调过期超时值(如果有)。
  • RemoveRemoveAsync – 会根据其字符串键删除缓存项。

建立分布式缓存服务Establish distributed caching services

Startup.ConfigureServices中注册 IDistributedCache 的实现。本主题中所述的框架提供的实现包括:

分布式内存缓存Distributed Memory Cache

分布式内存缓存(AddDistributedMemoryCache)是一个框架提供的 IDistributedCache 的实现,用于将项存储在内存中。分布式内存缓存不是实际的分布式缓存。缓存项由应用程序实例存储在运行应用程序的服务器上。

分布式内存缓存是一种有用的实现:

  • 用于开发和测试方案。
  • 在生产环境中使用单一服务器并且内存消耗不是问题。实现分布式内存缓存会抽象化缓存的数据存储。如果需要多个节点或容错,可以在将来实现真正的分布式缓存解决方案。

当应用程序在 Startup.ConfigureServices的开发环境中运行时,示例应用程序会使用分布式内存缓存:

  1. services.AddDistributedMemoryCache();

分布式 SQL Server 缓存Distributed SQL Server Cache

分布式 SQL Server 缓存实现(AddDistributedSqlServerCache)允许分布式缓存使用 SQL Server 数据库作为其后备存储。若要在 SQL Server 实例中创建 SQL Server 缓存的项表,可以使用 sql-cache 工具。该工具将创建一个表,其中包含指定的名称和架构。

通过运行 sql-cache create 命令在 SQL Server 中创建一个表。提供 SQL Server 实例(Data Source)、数据库(Initial Catalog)、架构(例如 dbo)和表名(例如,TestCache):

  1. dotnet sql-cache create "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=DistCache;Integrated Security=True;" dbo TestCache

将记录一条消息,指示该工具已成功:

  1. Table and index were created successfully.

sql-cache 工具创建的表具有以下架构:

SqlServer 缓存表

备注

应用应使用 IDistributedCache的实例而不是 SqlServerCache来操作缓存值。

示例应用在 Startup.ConfigureServices的非开发环境中实施 SqlServerCache

  1. services.AddDistributedSqlServerCache(options =>
  2. {
  3. options.ConnectionString =
  4. _config["DistCache_ConnectionString"];
  5. options.SchemaName = "dbo";
  6. options.TableName = "TestCache";
  7. });

备注

ConnectionString (并且可以选择 SchemaNameTableName)通常存储在源代码管理之外(例如,由机密管理器存储或在appsettings/appsettings 中存储) 。环境} json文件)。连接字符串可能包含应保留在源代码管理系统之外的凭据。

分布式 Redis 缓存Distributed Redis Cache

Redis是内存中数据存储的开源数据存储,通常用作分布式缓存。可以在本地使用 Redis,也可以为 Azure 托管的 ASP.NET Core 应用配置Azure Redis 缓存

应用使用 Startup.ConfigureServices的非开发环境中的 RedisCache 实例(AddStackExchangeRedisCache)配置缓存实现:

  1. services.AddStackExchangeRedisCache(options =>
  2. {
  3. options.Configuration = "localhost";
  4. options.InstanceName = "SampleInstance";
  5. });

若要在本地计算机上安装 Redis:

分布式 NCache 缓存Distributed NCache Cache

NCache是在 .NET 和 .net Core 中以本机方式开发的开源内存中分布式缓存。NCache 在本地工作并配置为分布式缓存群集,适用于在 Azure 或其他托管平台上运行的 ASP.NET Core 应用。

若要在本地计算机上安装和配置 NCache,请参阅适用于 Windows 的 NCache 入门指南

配置 NCache:

  1. services.AddNCacheDistributedCache(configuration =>
  2. {
  3. configuration.CacheName = "demoClusteredCache";
  4. configuration.EnableLogs = true;
  5. configuration.ExceptionsEnabled = true;
  6. });

使用分布式缓存Use the distributed cache

若要使用 IDistributedCache 接口,请从应用程序中的任何构造函数请求 IDistributedCache 的实例。实例通过依赖关系注入(DI)来提供。

示例应用启动时,IDistributedCache 被注入到 Startup.Configure中。当前时间使用 IHostApplicationLifetime 进行缓存(有关详细信息,请参阅泛型 Host: IHostApplicationLifetime):

  1. public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
  2. IHostApplicationLifetime lifetime, IDistributedCache cache)
  3. {
  4. lifetime.ApplicationStarted.Register(() =>
  5. {
  6. var currentTimeUTC = DateTime.UtcNow.ToString();
  7. byte[] encodedCurrentTimeUTC = Encoding.UTF8.GetBytes(currentTimeUTC);
  8. var options = new DistributedCacheEntryOptions()
  9. .SetSlidingExpiration(TimeSpan.FromSeconds(20));
  10. cache.Set("cachedTimeUTC", encodedCurrentTimeUTC, options);
  11. });

示例应用将 IDistributedCache 插入到 IndexModel 中,供索引页使用。

每次加载索引页时,都会在 OnGetAsync中检查缓存时间的缓存。如果缓存的时间未过期,则会显示时间。如果自上次访问缓存时间之后经过了20秒(最后一次加载此页),则页面显示缓存的时间已过期

通过选择 "重置缓存时间" 按钮立即将缓存的时间更新为当前时间。按钮触发 OnPostResetCachedTime 处理程序方法。

  1. public class IndexModel : PageModel
  2. {
  3. private readonly IDistributedCache _cache;
  4. public IndexModel(IDistributedCache cache)
  5. {
  6. _cache = cache;
  7. }
  8. public string CachedTimeUTC { get; set; }
  9. public async Task OnGetAsync()
  10. {
  11. CachedTimeUTC = "Cached Time Expired";
  12. var encodedCachedTimeUTC = await _cache.GetAsync("cachedTimeUTC");
  13. if (encodedCachedTimeUTC != null)
  14. {
  15. CachedTimeUTC = Encoding.UTF8.GetString(encodedCachedTimeUTC);
  16. }
  17. }
  18. public async Task<IActionResult> OnPostResetCachedTime()
  19. {
  20. var currentTimeUTC = DateTime.UtcNow.ToString();
  21. byte[] encodedCurrentTimeUTC = Encoding.UTF8.GetBytes(currentTimeUTC);
  22. var options = new DistributedCacheEntryOptions()
  23. .SetSlidingExpiration(TimeSpan.FromSeconds(20));
  24. await _cache.SetAsync("cachedTimeUTC", encodedCurrentTimeUTC, options);
  25. return RedirectToPage();
  26. }
  27. }

备注

对于 IDistributedCache 实例,无需使用单独的或作用域生存期(至少对于内置实现而言)。

你还可以创建一个 IDistributedCache 实例,而不必使用 DI,而是使用代码创建一个实例,从而使代码更难以测试,并违反了显式依赖关系原则

建议Recommendations

确定最适合你的应用的 IDistributedCache 实现时,请考虑以下事项:

  • 现有基础结构
  • 性能要求
  • 成本
  • 团队体验

缓存解决方案通常依赖于内存中的存储以快速检索缓存的数据,但是,内存是有限的资源,并且很昂贵。仅将常用数据存储在缓存中。

通常,Redis 缓存提供比 SQL Server 缓存更高的吞吐量和更低的延迟。但是,通常需要进行基准测试来确定缓存策略的性能特征。

当 SQL Server 用作分布式缓存后备存储时,对缓存使用同一数据库,并且应用的普通数据存储和检索会对这两种情况的性能产生负面影响。建议使用分布式缓存后备存储的专用 SQL Server 实例。

其他资源Additional resources

分布式缓存是由多个应用服务器共享的缓存,通常作为外部服务在访问它的应用服务器上维护。分布式缓存可以提高 ASP.NET Core 应用程序的性能和可伸缩性,尤其是在应用程序由云服务或服务器场托管时。

与其他缓存方案相比,分布式缓存具有多项优势,其中缓存的数据存储在单个应用服务器上。

当分布式缓存数据时,数据将:

  • 跨多个服务器的请求具有连贯(一致)。
  • 置服务器重启和应用部署。
  • 不使用本地内存。

分布式缓存配置是特定于实现的。本文介绍如何配置 SQL Server 和 Redis 分布式缓存。第三方实现也可用,例如NCacheGitHub 上的 NCache)。无论选择哪种实现,应用都使用 IDistributedCache 接口与缓存交互。

查看或下载示例代码如何下载

必备条件Prerequisites

若要使用 SQL Server 分布式缓存,请参考AspNetCore 元包,或添加对包的包引用。

若要使用 Redis 分布式缓存,请参考AspNetCore 元包,并将包引用添加到包。Redis 包不包含在 Microsoft.AspNetCore.App 包中,因此必须在项目文件中单独引用 Redis 包。

若要使用 NCache 分布式缓存,请参考AspNetCore 元包,并将包引用添加到NCache包中。NCache 包不包含在 Microsoft.AspNetCore.App 包中,因此必须在项目文件中单独引用 NCache 包。

IDistributedCache 接口IDistributedCache interface

IDistributedCache 接口提供以下方法来处理分布式缓存实现中的项:

  • GetGetAsync – 接受字符串键,并检索缓存项作为 byte[] 数组(如果在缓存中找到)。
  • SetSetAsync – 使用字符串键将项(作为 byte[] 数组)添加到缓存中。
  • Refresh中,RefreshAsync – 基于其键刷新缓存中的项,并重置其可调过期超时值(如果有)。
  • RemoveRemoveAsync – 会根据其字符串键删除缓存项。

建立分布式缓存服务Establish distributed caching services

Startup.ConfigureServices中注册 IDistributedCache 的实现。本主题中所述的框架提供的实现包括:

分布式内存缓存Distributed Memory Cache

分布式内存缓存(AddDistributedMemoryCache)是一个框架提供的 IDistributedCache 的实现,用于将项存储在内存中。分布式内存缓存不是实际的分布式缓存。缓存项由应用程序实例存储在运行应用程序的服务器上。

分布式内存缓存是一种有用的实现:

  • 用于开发和测试方案。
  • 在生产环境中使用单一服务器并且内存消耗不是问题。实现分布式内存缓存会抽象化缓存的数据存储。如果需要多个节点或容错,可以在将来实现真正的分布式缓存解决方案。

当应用程序在 Startup.ConfigureServices的开发环境中运行时,示例应用程序会使用分布式内存缓存:

  1. services.AddDistributedMemoryCache();

分布式 SQL Server 缓存Distributed SQL Server Cache

分布式 SQL Server 缓存实现(AddDistributedSqlServerCache)允许分布式缓存使用 SQL Server 数据库作为其后备存储。若要在 SQL Server 实例中创建 SQL Server 缓存的项表,可以使用 sql-cache 工具。该工具将创建一个表,其中包含指定的名称和架构。

通过运行 sql-cache create 命令在 SQL Server 中创建一个表。提供 SQL Server 实例(Data Source)、数据库(Initial Catalog)、架构(例如 dbo)和表名(例如,TestCache):

  1. dotnet sql-cache create "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=DistCache;Integrated Security=True;" dbo TestCache

将记录一条消息,指示该工具已成功:

  1. Table and index were created successfully.

sql-cache 工具创建的表具有以下架构:

SqlServer 缓存表

备注

应用应使用 IDistributedCache的实例而不是 SqlServerCache来操作缓存值。

示例应用在 Startup.ConfigureServices的非开发环境中实施 SqlServerCache

  1. services.AddDistributedSqlServerCache(options =>
  2. {
  3. options.ConnectionString =
  4. _config["DistCache_ConnectionString"];
  5. options.SchemaName = "dbo";
  6. options.TableName = "TestCache";
  7. });

备注

ConnectionString (并且可以选择 SchemaNameTableName)通常存储在源代码管理之外(例如,由机密管理器存储或在appsettings/appsettings 中存储) 。环境} json文件)。连接字符串可能包含应保留在源代码管理系统之外的凭据。

分布式 Redis 缓存Distributed Redis Cache

Redis是内存中数据存储的开源数据存储,通常用作分布式缓存。可以在本地使用 Redis,也可以为 Azure 托管的 ASP.NET Core 应用配置Azure Redis 缓存

应用使用 Startup.ConfigureServices的非开发环境中的 RedisCache 实例(AddStackExchangeRedisCache)配置缓存实现:

  1. services.AddStackExchangeRedisCache(options =>
  2. {
  3. options.Configuration = "localhost";
  4. options.InstanceName = "SampleInstance";
  5. });

若要在本地计算机上安装 Redis:

分布式 NCache 缓存Distributed NCache Cache

NCache是在 .NET 和 .net Core 中以本机方式开发的开源内存中分布式缓存。NCache 在本地工作并配置为分布式缓存群集,适用于在 Azure 或其他托管平台上运行的 ASP.NET Core 应用。

若要在本地计算机上安装和配置 NCache,请参阅适用于 Windows 的 NCache 入门指南

配置 NCache:

  1. services.AddNCacheDistributedCache(configuration =>
  2. {
  3. configuration.CacheName = "demoClusteredCache";
  4. configuration.EnableLogs = true;
  5. configuration.ExceptionsEnabled = true;
  6. });

使用分布式缓存Use the distributed cache

若要使用 IDistributedCache 接口,请从应用程序中的任何构造函数请求 IDistributedCache 的实例。实例通过依赖关系注入(DI)来提供。

示例应用启动时,IDistributedCache 被注入到 Startup.Configure中。当前时间使用 IApplicationLifetime 进行缓存(有关详细信息,请参阅Web Host: IApplicationLifetime interface):

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env,
  2. IApplicationLifetime lifetime, IDistributedCache cache)
  3. {
  4. lifetime.ApplicationStarted.Register(() =>
  5. {
  6. var currentTimeUTC = DateTime.UtcNow.ToString();
  7. byte[] encodedCurrentTimeUTC = Encoding.UTF8.GetBytes(currentTimeUTC);
  8. var options = new DistributedCacheEntryOptions()
  9. .SetSlidingExpiration(TimeSpan.FromSeconds(20));
  10. cache.Set("cachedTimeUTC", encodedCurrentTimeUTC, options);
  11. });

示例应用将 IDistributedCache 插入到 IndexModel 中,供索引页使用。

每次加载索引页时,都会在 OnGetAsync中检查缓存时间的缓存。如果缓存的时间未过期,则会显示时间。如果自上次访问缓存时间之后经过了20秒(最后一次加载此页),则页面显示缓存的时间已过期

通过选择 "重置缓存时间" 按钮立即将缓存的时间更新为当前时间。按钮触发 OnPostResetCachedTime 处理程序方法。

  1. public class IndexModel : PageModel
  2. {
  3. private readonly IDistributedCache _cache;
  4. public IndexModel(IDistributedCache cache)
  5. {
  6. _cache = cache;
  7. }
  8. public string CachedTimeUTC { get; set; }
  9. public async Task OnGetAsync()
  10. {
  11. CachedTimeUTC = "Cached Time Expired";
  12. var encodedCachedTimeUTC = await _cache.GetAsync("cachedTimeUTC");
  13. if (encodedCachedTimeUTC != null)
  14. {
  15. CachedTimeUTC = Encoding.UTF8.GetString(encodedCachedTimeUTC);
  16. }
  17. }
  18. public async Task<IActionResult> OnPostResetCachedTime()
  19. {
  20. var currentTimeUTC = DateTime.UtcNow.ToString();
  21. byte[] encodedCurrentTimeUTC = Encoding.UTF8.GetBytes(currentTimeUTC);
  22. var options = new DistributedCacheEntryOptions()
  23. .SetSlidingExpiration(TimeSpan.FromSeconds(20));
  24. await _cache.SetAsync("cachedTimeUTC", encodedCurrentTimeUTC, options);
  25. return RedirectToPage();
  26. }
  27. }

备注

对于 IDistributedCache 实例,无需使用单独的或作用域生存期(至少对于内置实现而言)。

你还可以创建一个 IDistributedCache 实例,而不必使用 DI,而是使用代码创建一个实例,从而使代码更难以测试,并违反了显式依赖关系原则

建议Recommendations

确定最适合你的应用的 IDistributedCache 实现时,请考虑以下事项:

  • 现有基础结构
  • 性能要求
  • 成本
  • 团队体验

缓存解决方案通常依赖于内存中的存储以快速检索缓存的数据,但是,内存是有限的资源,并且很昂贵。仅将常用数据存储在缓存中。

通常,Redis 缓存提供比 SQL Server 缓存更高的吞吐量和更低的延迟。但是,通常需要进行基准测试来确定缓存策略的性能特征。

当 SQL Server 用作分布式缓存后备存储时,对缓存使用同一数据库,并且应用的普通数据存储和检索会对这两种情况的性能产生负面影响。建议使用分布式缓存后备存储的专用 SQL Server 实例。

其他资源Additional resources

分布式缓存是由多个应用服务器共享的缓存,通常作为外部服务在访问它的应用服务器上维护。分布式缓存可以提高 ASP.NET Core 应用程序的性能和可伸缩性,尤其是在应用程序由云服务或服务器场托管时。

与其他缓存方案相比,分布式缓存具有多项优势,其中缓存的数据存储在单个应用服务器上。

当分布式缓存数据时,数据将:

  • 跨多个服务器的请求具有连贯(一致)。
  • 置服务器重启和应用部署。
  • 不使用本地内存。

分布式缓存配置是特定于实现的。本文介绍如何配置 SQL Server 和 Redis 分布式缓存。第三方实现也可用,例如NCacheGitHub 上的 NCache)。无论选择哪种实现,应用都使用 IDistributedCache 接口与缓存交互。

查看或下载示例代码如何下载

必备条件Prerequisites

若要使用 SQL Server 分布式缓存,请参考AspNetCore 元包,或添加对包的包引用。

若要使用 Redis 分布式缓存,请参考AspNetCore 元包,并将包引用添加到包。Redis 包不包含在 Microsoft.AspNetCore.App 包中,因此必须在项目文件中单独引用 Redis 包。

若要使用 NCache 分布式缓存,请参考AspNetCore 元包,并将包引用添加到NCache包中。NCache 包不包含在 Microsoft.AspNetCore.App 包中,因此必须在项目文件中单独引用 NCache 包。

IDistributedCache 接口IDistributedCache interface

IDistributedCache 接口提供以下方法来处理分布式缓存实现中的项:

  • GetGetAsync – 接受字符串键,并检索缓存项作为 byte[] 数组(如果在缓存中找到)。
  • SetSetAsync – 使用字符串键将项(作为 byte[] 数组)添加到缓存中。
  • Refresh中,RefreshAsync – 基于其键刷新缓存中的项,并重置其可调过期超时值(如果有)。
  • RemoveRemoveAsync – 会根据其字符串键删除缓存项。

建立分布式缓存服务Establish distributed caching services

Startup.ConfigureServices中注册 IDistributedCache 的实现。本主题中所述的框架提供的实现包括:

分布式内存缓存Distributed Memory Cache

分布式内存缓存(AddDistributedMemoryCache)是一个框架提供的 IDistributedCache 的实现,用于将项存储在内存中。分布式内存缓存不是实际的分布式缓存。缓存项由应用程序实例存储在运行应用程序的服务器上。

分布式内存缓存是一种有用的实现:

  • 用于开发和测试方案。
  • 在生产环境中使用单一服务器并且内存消耗不是问题。实现分布式内存缓存会抽象化缓存的数据存储。如果需要多个节点或容错,可以在将来实现真正的分布式缓存解决方案。

当应用程序在 Startup.ConfigureServices的开发环境中运行时,示例应用程序会使用分布式内存缓存:

  1. services.AddDistributedMemoryCache();

分布式 SQL Server 缓存Distributed SQL Server Cache

分布式 SQL Server 缓存实现(AddDistributedSqlServerCache)允许分布式缓存使用 SQL Server 数据库作为其后备存储。若要在 SQL Server 实例中创建 SQL Server 缓存的项表,可以使用 sql-cache 工具。该工具将创建一个表,其中包含指定的名称和架构。

通过运行 sql-cache create 命令在 SQL Server 中创建一个表。提供 SQL Server 实例(Data Source)、数据库(Initial Catalog)、架构(例如 dbo)和表名(例如,TestCache):

  1. dotnet sql-cache create "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=DistCache;Integrated Security=True;" dbo TestCache

将记录一条消息,指示该工具已成功:

  1. Table and index were created successfully.

sql-cache 工具创建的表具有以下架构:

SqlServer 缓存表

备注

应用应使用 IDistributedCache的实例而不是 SqlServerCache来操作缓存值。

示例应用在 Startup.ConfigureServices的非开发环境中实施 SqlServerCache

  1. services.AddDistributedSqlServerCache(options =>
  2. {
  3. options.ConnectionString =
  4. _config["DistCache_ConnectionString"];
  5. options.SchemaName = "dbo";
  6. options.TableName = "TestCache";
  7. });

备注

ConnectionString (并且可以选择 SchemaNameTableName)通常存储在源代码管理之外(例如,由机密管理器存储或在appsettings/appsettings 中存储) 。环境} json文件)。连接字符串可能包含应保留在源代码管理系统之外的凭据。

分布式 Redis 缓存Distributed Redis Cache

Redis是内存中数据存储的开源数据存储,通常用作分布式缓存。可以在本地使用 Redis,也可以为 Azure 托管的 ASP.NET Core 应用配置Azure Redis 缓存

应用使用 RedisCache 实例(AddDistributedRedisCache)配置缓存实现:

  1. services.AddDistributedRedisCache(options =>
  2. {
  3. options.Configuration = "localhost";
  4. options.InstanceName = "SampleInstance";
  5. });

若要在本地计算机上安装 Redis:

分布式 NCache 缓存Distributed NCache Cache

NCache是在 .NET 和 .net Core 中以本机方式开发的开源内存中分布式缓存。NCache 在本地工作并配置为分布式缓存群集,适用于在 Azure 或其他托管平台上运行的 ASP.NET Core 应用。

若要在本地计算机上安装和配置 NCache,请参阅适用于 Windows 的 NCache 入门指南

配置 NCache:

  1. services.AddNCacheDistributedCache(configuration =>
  2. {
  3. configuration.CacheName = "demoClusteredCache";
  4. configuration.EnableLogs = true;
  5. configuration.ExceptionsEnabled = true;
  6. });

使用分布式缓存Use the distributed cache

若要使用 IDistributedCache 接口,请从应用程序中的任何构造函数请求 IDistributedCache 的实例。实例通过依赖关系注入(DI)来提供。

示例应用启动时,IDistributedCache 被注入到 Startup.Configure中。当前时间使用 IApplicationLifetime 进行缓存(有关详细信息,请参阅Web Host: IApplicationLifetime interface):

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env,
  2. IApplicationLifetime lifetime, IDistributedCache cache)
  3. {
  4. lifetime.ApplicationStarted.Register(() =>
  5. {
  6. var currentTimeUTC = DateTime.UtcNow.ToString();
  7. byte[] encodedCurrentTimeUTC = Encoding.UTF8.GetBytes(currentTimeUTC);
  8. var options = new DistributedCacheEntryOptions()
  9. .SetSlidingExpiration(TimeSpan.FromSeconds(20));
  10. cache.Set("cachedTimeUTC", encodedCurrentTimeUTC, options);
  11. });

示例应用将 IDistributedCache 插入到 IndexModel 中,供索引页使用。

每次加载索引页时,都会在 OnGetAsync中检查缓存时间的缓存。如果缓存的时间未过期,则会显示时间。如果自上次访问缓存时间之后经过了20秒(最后一次加载此页),则页面显示缓存的时间已过期

通过选择 "重置缓存时间" 按钮立即将缓存的时间更新为当前时间。按钮触发 OnPostResetCachedTime 处理程序方法。

  1. public class IndexModel : PageModel
  2. {
  3. private readonly IDistributedCache _cache;
  4. public IndexModel(IDistributedCache cache)
  5. {
  6. _cache = cache;
  7. }
  8. public string CachedTimeUTC { get; set; }
  9. public async Task OnGetAsync()
  10. {
  11. CachedTimeUTC = "Cached Time Expired";
  12. var encodedCachedTimeUTC = await _cache.GetAsync("cachedTimeUTC");
  13. if (encodedCachedTimeUTC != null)
  14. {
  15. CachedTimeUTC = Encoding.UTF8.GetString(encodedCachedTimeUTC);
  16. }
  17. }
  18. public async Task<IActionResult> OnPostResetCachedTime()
  19. {
  20. var currentTimeUTC = DateTime.UtcNow.ToString();
  21. byte[] encodedCurrentTimeUTC = Encoding.UTF8.GetBytes(currentTimeUTC);
  22. var options = new DistributedCacheEntryOptions()
  23. .SetSlidingExpiration(TimeSpan.FromSeconds(20));
  24. await _cache.SetAsync("cachedTimeUTC", encodedCurrentTimeUTC, options);
  25. return RedirectToPage();
  26. }
  27. }

备注

对于 IDistributedCache 实例,无需使用单独的或作用域生存期(至少对于内置实现而言)。

你还可以创建一个 IDistributedCache 实例,而不必使用 DI,而是使用代码创建一个实例,从而使代码更难以测试,并违反了显式依赖关系原则

建议Recommendations

确定最适合你的应用的 IDistributedCache 实现时,请考虑以下事项:

  • 现有基础结构
  • 性能要求
  • 成本
  • 团队体验

缓存解决方案通常依赖于内存中的存储以快速检索缓存的数据,但是,内存是有限的资源,并且很昂贵。仅将常用数据存储在缓存中。

通常,Redis 缓存提供比 SQL Server 缓存更高的吞吐量和更低的延迟。但是,通常需要进行基准测试来确定缓存策略的性能特征。

当 SQL Server 用作分布式缓存后备存储时,对缓存使用同一数据库,并且应用的普通数据存储和检索会对这两种情况的性能产生负面影响。建议使用分布式缓存后备存储的专用 SQL Server 实例。

其他资源Additional resources