CacheCow:.NET 中的简单易用 HTTP 缓存

在开发中,HTTP 缓存是提高性能、减少服务器压力的重要手段。
CacheCow 是一个专为 .NET 设计的 HTTP 缓存库。
支持 .NET Core 和 .NET Framework 4.52 及以上版本。
本文将介绍 CacheCow 的基本用法、核心概念和使用技巧。


📦 安装方法

可以通过 NuGet 来安装 CacheCow:

  • • Client 版本(用于客户端缓存)

    Install-Package CacheCow.Client
  • • Server 版本(用于 ASP.NET MVC Core 或 Web API)

    Install-Package CacheCow.Server.Core.Mvc
    # 或者
    Install-Package CacheCow.Server.WebApi

🧰 核心概念

1. CacheCow.Client

这是用于 HttpClient 的客户端缓存模块。
它会自动处理请求的缓存逻辑,包括检查是否命中缓存、发送条件请求等。

2. CacheCow.Server

这是用于 ASP.NET Web API 或 MVC Core 的服务端缓存模块。
它负责生成缓存指令,并处理客户端的条件请求。

3. 资源与表示

  • • Resource(资源):比如 /api/car/1 是一个资源。

  • • Representation(表示):同一个资源可能有多种表示方式,例如 JSON 或 XML 格式。

4. 缓存控制头

CacheCow 支持以下 HTTP 缓存相关的头部:

  • • Cache-Control

  • • Expires

  • • ETag

  • • Last-Modified

  • • Vary

这些头部决定了客户端如何缓存资源,以及何时重新验证。


🚀 快速上手

客户端使用示例

1. 创建带有缓存功能的 HttpClient
var client = ClientExtensions.CreateClient();
2. 发起请求并查看缓存状态
const string Url = "https://code.jquery.com/jquery-3.3.1.slim.min.js";
var response = client.GetAsync(Url).Result;
var cachedResponse = client.GetAsync(Url).Result;

Console.WriteLine(response.Headers.GetCacheCowHeader());
// 输出:2.0.0.0;did-not-exist=true

Console.WriteLine(cachedResponse.Headers.GetCacheCowHeader());
// 输出:2.0.0.0;did-not-exist=false;retrieved-from-cache=true

第一次请求从网络获取数据,第二次直接从缓存读取。


ASP.NET MVC Core 使用示例

1. 注册服务
public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpCachingMvc(); // 启用 HTTP 缓存
}
2. 在控制器中启用缓存
[HttpGet]
[HttpCacheFactory(300)] // 设置缓存时间为 300 秒
public IActionResult Get(int id)
{
    return Ok(new { Id = id, Name = "Test" });
}

ASP.NET Web API 使用示例

1. 添加 NuGet 包
Install-Package CacheCow.Server.WebApi
2. 在控制器中启用缓存
[HttpGet]
[HttpCache(DefaultExpirySeconds = 300)]
public IHttpActionResult Get(int id)
{
    return Ok(new { Id = id, Name = "Test" });
}

📊 缓存诊断信息

CacheCow 提供了两个诊断头部来帮助你了解缓存行为:

头部名称

描述

x-cachecow-client

客户端缓存的行为,如是否命中缓存、是否从网络加载等

x-cachecow-server

服务端缓存的行为,如是否进行验证、是否短路响应等

例如,客户端返回:

2.0.0.0;did-not-exist=false;retrieved-from-cache=true

说明该请求是从缓存中获取的。


⚙️ 高级配置

自定义缓存存储

默认情况下,CacheCow 使用内存作为缓存存储。
如果需要更持久或分布式的缓存,可以使用 Redis 存储。

使用 Redis 存储
var options = new RedisCacheStoreOptions("localhost");
var cacheStore = new RedisCacheStore(options);
var handler = new CachingHandler(cacheStore);

自定义 ETag 生成

ETag 是缓存验证的核心机制。
默认情况下,CacheCow 会通过序列化对象生成 ETag。
对于大型对象,这可能会影响性能。
可以实现 ITimedETagExtractor<T> 接口来自定义 ETag 生成逻辑。

示例:基于 LastModifiedDate 生成 ETag
public class CarETagExtractor : ITimedETagExtractor<Car>
{
    public TimedEntityTagHeaderValue Extract(Car car)
    {
        var timestamp = BitConverter.GetBytes(car.LastModifiedDate.Ticks);
        return new TimedEntityTagHeaderValue($"\"{Convert.ToBase64String(timestamp)}\"");
    }
}

注册这个提取器后,CacheCow 将使用它来生成 ETag。


🔄 依赖注入支持

在 ASP.NET Core 中,你可以通过 DI 容器注册自定义的 ETag 提取器和服务查询器。

示例:注册 Car 的 ETag 提取器
services.AddSingleton<ITimedETagExtractor<Car>, CarETagExtractor>();

然后在控制器中指定 ViewModel 类型:

[HttpGet]
[HttpCacheFactory(300, ViewModelType = typeof(Car))]
public IActionResult Get(int id)
{
    return Ok(GetCar(id));
}

🛠️ 配置管理

CacheCow 支持从 appsettings.json 文件中读取缓存配置。

配置文件
{
  "CacheCow": {
    "Car": {
      "Get": {
        "Expiry": "00:00:10"
      }
    }
  }
}

这段配置表示 CarController 的 Get 方法的缓存时间为 10 秒。


📝 总结

CacheCow 是一个强大而灵活的 HTTP 缓存工具。
它简化了客户端和服务端的缓存实现。
无论你是开发 ASP.NET MVC 应用还是 Web API,都可以轻松集成 CacheCow 来提升性能。

赶快试试吧!🚀

GitHub 地址:https://github.com/aliostad/CacheCow


如果你觉得这篇文章对你有帮助,欢迎点赞、收藏并分享给更多开发者!让我们一起学习,共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值