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 缓存机制也能进一步提升客户端性能。

相关推荐
OH_TPC1 小时前
【鸿蒙优选三方库】@react-native-ohos/react-native-fast-image:高性能图片加载与缓存组件
缓存·华为·harmonyos·鸿蒙
liangshanbo12151 小时前
手写 Event Emitter(事件发射器)
缓存
数智启示录2 小时前
Apache Kafka Consumer 扩到 40 个仍不提速:Partition 上限锁死有效并行度 【Kafka合集】
数据库·经验分享·分布式·缓存·面试·kafka·apache
2601_962297253 小时前
python自带缓存lru_cache用法及扩展的使用_python
python·缓存·装饰器·lru_cache·my_cache
xixingzhe24 小时前
SpringBoot 接口缓存实现
spring boot·后端·缓存
莫得感情 o15 小时前
Redis 05 · 持久化:RDB 与 AOF 怎么保证数据不丢
redis·缓存
curd_boy16 小时前
【Redis】Redis从缓存到AI向量平台
人工智能·redis·缓存
kiracrimson16 小时前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
2601_9623010120 小时前
深入理解缓存(Cache):原理、应用与优化
缓存·计算机原理·优化策略·数据访问·系统性能
数智启示录21 小时前
PostgreSQL 计划缓存实战(第 10 篇):预编译 SQL 前五次都快,第六次为什么可能变慢
经验分享·sql·缓存·postgresql·面试