返回

ASP.NET Core缓存技术详解:Redis、本地缓存与响应缓存优化实践指南

2026-07-26 ASP.NET Core 缓存 171 0

在开发 ASP.NET Core 应用时,数据库查询、接口计算和重复数据处理往往会成为系统性能瓶颈。随着用户数量增加,如果每一次请求都直接访问数据库,不仅会增加服务器压力,还可能导致接口响应速度下降。

缓存是提升 Web 应用性能的重要技术之一。合理使用缓存,可以将经常访问的数据提前保存起来,在下一次请求时直接返回缓存结果,从而减少数据库访问次数,提高系统吞吐能力。

ASP.NET Core 提供了多种缓存方案,包括基于服务器内存的本地缓存、基于 Redis 的分布式缓存,以及针对 HTTP 响应优化的响应缓存。不同缓存方式适用于不同业务场景,需要根据应用架构合理选择。ASP.NET Core 官方提供了 IMemoryCache、IDistributedCache 等缓存抽象,同时支持 Redis 等分布式缓存方案。

ASP.NET Core缓存的常见类型

在 ASP.NET Core 中,缓存主要分为三类:

1. 本地内存缓存 IMemoryCache

本地缓存是最简单的一种缓存方式,它直接将数据存储在当前应用服务器的内存中。

例如,一个网站首页需要展示热门文章列表,每分钟只需要更新一次,那么第一次查询数据库后,可以将结果保存到内存缓存中,后续请求直接读取缓存。

使用方式:

builder.Services.AddMemoryCache();

在控制器中注入:

private readonly IMemoryCache _cache;

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

写入缓存:

_cache.Set("hot_articles", articles, TimeSpan.FromMinutes(10));

读取缓存:

if (!_cache.TryGetValue("hot_articles", out List<Article>? articles))
{
    articles = GetArticlesFromDatabase();

    _cache.Set(
        "hot_articles",
        articles,
        TimeSpan.FromMinutes(10));
}

本地缓存速度非常快,因为数据直接存在应用进程内存中。但是它也存在明显限制:

  • 多服务器部署时,每台服务器都有自己的缓存数据;
  • 应用重启后缓存会丢失;
  • 不适合存储大量数据。

因此,本地缓存更适合单体应用、小规模项目或者热点数据缓存。

2. Redis分布式缓存:企业项目常用方案

当 ASP.NET Core 应用部署到多个服务器时,本地缓存可能出现数据不一致的问题。

例如:用户请求第一次访问服务器 A,服务器 A 查询数据库并缓存数据。下一次请求被负载均衡转发到服务器 B,由于服务器 B 没有缓存,还需要重新查询数据库。这时就需要使用分布式缓存。

Redis 是目前 ASP.NET Core 项目中最常见的分布式缓存方案。Redis 基于内存存储,具有较高读写性能,并且可以被多个应用服务器共享。ASP.NET Core 可以通过 IDistributedCache 接口统一访问 Redis 缓存。

安装 Redis 缓存组件:

dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis

注册 Redis:

builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration =
        "localhost:6379";

    options.InstanceName =
        "MyApp:";
});

使用 IDistributedCache:

private readonly IDistributedCache _cache;

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

保存数据:

await _cache.SetStringAsync(
    "user_1001",
    JsonSerializer.Serialize(user));

读取数据:

var json =
    await _cache.GetStringAsync("user_1001");

var user =
    JsonSerializer.Deserialize<User>(json);

Redis 缓存非常适合以下场景:

  • 用户登录状态;
  • 验证码缓存;
  • 商品信息缓存;
  • 热门文章列表;
  • API 查询结果缓存;
  • 分布式锁。

在生产环境中,如果应用运行在云服务器、容器集群或者多节点环境,Redis 分布式缓存通常比单机内存缓存更加合适。

3. 响应缓存 Response Caching优化接口性能

除了缓存业务数据,ASP.NET Core 还提供响应缓存机制。响应缓存主要针对 HTTP 请求,将接口返回结果缓存起来。当客户端再次请求相同资源时,可以直接使用缓存响应,减少服务器重复计算。

ASP.NET Core 响应缓存主要依赖 HTTP Cache-Control 标头,通过客户端或者代理服务器缓存响应内容。

启用响应缓存:

builder.Services.AddResponseCaching();

app.UseResponseCaching();

控制器中使用:

[ResponseCache(
    Duration = 60,
    Location = ResponseCacheLocation.Any)]
public IActionResult GetNews()
{
    return Ok(news);
}

上面的代码表示:

  • 缓存时间为60秒;
  • 客户端和代理服务器都可以缓存;
  • 60秒内重复请求可以直接返回缓存结果。

响应缓存适用于:

  • 新闻列表;
  • 网站首页;
  • 公共配置接口;
  • 不经常变化的数据接口。

但是需要注意,涉及用户隐私的数据,例如个人信息接口、订单接口,不应该直接开启响应缓存,否则可能造成数据泄露。

Redis、本地缓存和响应缓存如何选择?

不同缓存方式解决的问题不同。

  • 如果项目是单服务器部署,例如个人博客、小型管理系统,可以优先考虑 IMemoryCache,开发简单,性能也非常高。
  • 如果项目需要负载均衡、多服务器部署,例如电商系统、企业后台、Web API 服务,推荐使用 Redis 分布式缓存。
  • 如果接口返回内容变化较少,并且多个用户访问相同数据,可以使用 Response Caching。

实际项目中,很多大型系统会组合使用:

数据库
↓
Redis缓存热点数据
↓
本地缓存保存高频访问数据
↓
Response Cache优化HTTP响应

这种多级缓存架构可以进一步降低数据库压力,提高系统稳定性。

ASP.NET Core缓存最佳实践

1. 设置合理的缓存过期时间

缓存时间不是越长越好。例如:

  • 用户权限数据可以缓存几分钟
  • 网站配置可以缓存几个小时
  • 新闻列表可能缓存几十秒

需要根据数据变化频率设置过期策略。

2. 避免缓存大量无效数据

缓存的目标是减少重复计算,而不是替代数据库。如果缓存大量低频访问数据,反而会浪费内存。

通常应该优先缓存:

  • 高频访问数据;
  • 查询成本较高的数据;
  • 计算复杂的数据。

3. 设计合理的缓存Key

缓存 Key 应保持唯一和易管理。例如:

  • user:1001
  • product:20001
  • article:list:hot

不要使用简单数字作为 Key,否则后期维护容易产生冲突。

4. 注意缓存雪崩和缓存穿透

大型系统中常见两个问题:

缓存雪崩:大量缓存同时过期,导致请求全部访问数据库。

解决方法:

  • 设置随机过期时间
  • 热点数据提前刷新
  • 使用 Redis 集群

缓存穿透:大量请求查询不存在的数据。

解决方法:

  • 缓存空结果
  • 使用布隆过滤器
  • 参数校验

总结

ASP.NET Core 提供了完善的缓存体系,可以满足从小型网站到大型分布式系统的性能优化需求。IMemoryCache 适合简单快速的本地缓存场景,Redis 分布式缓存适合企业级、多服务器部署环境,而 Response Caching 更适合优化 HTTP 接口响应。

在实际开发中,缓存并不是简单地把数据存起来,而是需要结合业务特点设计缓存策略。合理使用缓存,可以显著降低数据库压力,提高 ASP.NET Core 应用的响应速度和并发能力。对于正在开发 ASP.NET Core Web API、企业后台系统或者高并发网站的开发者来说,掌握 Redis、本地缓存和响应缓存的使用方式,是提升应用性能的重要技能。

顶部