ASP.NET Core Web API 缓存

ASP.NET Core Web API 中,缓存是一种常用的性能优化手段,它可以减少服务器处理请求和数据库查询的次数,尤其是在处理不经常变化的数据时效果显著。在 .NET Core 中,你可以使用多种缓存技术来提高应用的响应速度和可扩展性。

以下是几种常见的缓存方式:

1. 本地内存缓存

本地内存缓存是最简单的缓存形式,它将数据保存在服务器进程的内存中。这种缓存类型适合小型应用或者开发环境测试,因为当服务器重启或者进程结束时,缓存的数据就会丢失。

使用 IMemoryCache 接口

.NET Core 提供了 IMemoryCache 接口来实现本地内存缓存。首先,在 Startup.cs 文件中添加 IMemoryCache 服务到依赖注入容器中:

cs 复制代码
services.AddMemoryCache();

然后,在需要缓存功能的控制器或服务类中注入 IMemoryCache 实例,并使用它来存储和检索数据:

cs 复制代码
private readonly IMemoryCache _cache;

public MyController(IMemoryCache cache)
{
    _cache = cache;
}

[HttpGet]
public IActionResult GetData()
{
    var dataKey = "MyData";
    if (!_cache.TryGetValue(dataKey, out MyData myData))
    {
        myData = GetFreshDataFromDatabaseOrService();
        var options = new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromMinutes(10));
        _cache.Set(dataKey, myData, options);
    }

    return Ok(myData);
}

在这个例子中,我们首先尝试从缓存中获取数据。如果数据不存在,则从数据库或其他服务获取新鲜数据,然后将其放入缓存中,并设置一个滑动过期时间。

2. 分布式缓存

分布式缓存将数据存储在一个独立于应用服务器的外部系统中,使得多个服务器实例可以共享相同的缓存。这有助于解决本地内存缓存的局限性,特别是对于高可用性和负载均衡的场景。

使用 Redis 或 SQL Server

.NET Core 支持使用 Redis 或 SQL Server 作为分布式缓存后端。要启用 Redis 缓存,请先安装 NuGet 包 Microsoft.Extensions.Caching.StackExchangeRedis 然后配置 Redis 连接字符串:

cs 复制代码
services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = "localhost:6379"; // 配置 Redis 地址和端口
});

如果你选择使用 SQL Server 分布式缓存,请安装 NuGet 包 Microsoft.Extensions.Caching.SqlServer 并配置连接字符串:

cs 复制代码
services.AddDistributedSqlServerCache(options =>
{
    options.ConnectionString = "your_connection_string";
    options.SchemaName = "dbo";
    options.TableName = "TestCache";
});

之后,在需要缓存功能的地方替换为对应的分布式缓存实现,例如:

cs 复制代码
private readonly IDistributedCache _cache;

public MyController(IDistributedCache cache)
{
    _cache = cache;
}

3. HTTP 缓存

除了上述的编程式缓存之外,还可以利用 HTTP 协议本身的缓存机制来提高客户端性能。HTTP 缓存可以通过响应头中的 Cache-ControlExpires 等字段来控制客户端浏览器缓存行为。

使用 ETag 和 Last-Modified 头

ETag 和 Last-Modified 是两种 HTTP 标准头部,用于标识资源的版本和上次修改时间。客户端在后续请求时会发送相应的条件头部(如 If-None-Match 或 If-Modified-Since),服务器根据这些头部决定是否返回完整的响应还是仅返回一个简短的"未修改"状态。

要在 ASP.NET Core Web API 中启用 ETag 和 Last-Modified 头部支持,可以使用 ResponseCachingMiddlewareResponseCacheAttribute 类。首先,在 Startup.cs 的 ConfigureServices 方法中添加中间件:

cs 复制代码
services.AddResponseCaching();

然后,在 Configure 方法中添加中间件管道:

cs 复制代码
app.UseResponseCaching();

最后,在控制器方法上使用 ResponseCache 特性来指定缓存策略:

cs 复制代码
[HttpGet]
[ResponseCache(Duration = 60)]
public IActionResult GetData()
{
    // ...
}

在这个例子中,Duration 属性指定了缓存持续时间(以秒为单位)。其他属性包括 Location(允许设置缓存在何处)、NoStore(指示不应存储任何响应缓存)、VaryByHeaderVaryByQueryKeys(用于区分不同的缓存键)等。

总结起来,为了在 ASP.NET Core Web API 中实施缓存策略,你需要根据应用场景和需求选择合适的缓存类型,并适当地配置缓存选项。同时,了解并利用 HTTP 缓存机制也能进一步提升客户端性能。

相关推荐
吾好梦中写代码1 小时前
Redis——缓存
java·redis·缓存
rannn_1111 小时前
【Redis|高级篇2】多级缓存|JVM进程缓存、Lua语法、多级缓存实现(OpenResty)、缓存同步(Canal)
java·redis·分布式·后端·缓存·lua·openresty
SPC的存折8 小时前
1、Redis数据库基础
linux·运维·服务器·数据库·redis·缓存
身如柳絮随风扬15 小时前
Redis如何实现高效插入大量数据
数据库·redis·缓存
予早16 小时前
Redis 设置库的数量
数据库·redis·缓存
黑金IT16 小时前
vLLM本地缓存实战,重复提交直接复用不浪费算力
人工智能·缓存
Rick199318 小时前
Redis查询为什么快
数据库·redis·缓存
Rick199319 小时前
Redis 底层架构图
数据库·redis·缓存
Arva .20 小时前
Redis 数据类型
数据库·redis·缓存
笑我归无处20 小时前
Redis和数据库的数据一致性问题研究
数据库·redis·缓存