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

相关推荐
mit6.8241 小时前
[Redis#4] string | 常用命令 | + mysql use:cache | session
数据库·redis·后端·缓存
Beekeeper&&P...2 小时前
map和redis关系
数据库·redis·缓存
qq_364371724 小时前
Vue 内置组件 keep-alive 中 LRU 缓存淘汰策略和实现
前端·vue.js·缓存
刘九灵14 小时前
Redis ⽀持哪⼏种数据类型?适⽤场景,底层结构
redis·缓存
煎饼小狗1 天前
Redis五大基本类型——Zset有序集合命令详解(命令用法详解+思维导图详解)
数据库·redis·缓存
雯0609~1 天前
网页F12:缓存的使用(设值、取值、删除)
前端·缓存
菠萝咕噜肉i1 天前
超详细:Redis分布式锁
数据库·redis·分布式·缓存·分布式锁
只因在人海中多看了你一眼1 天前
分布式缓存 + 数据存储 + 消息队列知识体系
分布式·缓存
Dlwyz1 天前
redis-击穿、穿透、雪崩
数据库·redis·缓存
Oak Zhang1 天前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存