高性能 .NET 分布式二级缓存框架
L2Cache 是一个为 .NET 应用程序设计的现代化分布式二级缓存库。它无缝融合了本地内存缓存 (L1) 和 Redis 分布式缓存 (L2),旨在为高并发应用提供极速响应能力和极致的系统可靠性。
-
🚀 多级缓存架构
- L1 (内存): 基于
IMemoryCache,提供纳秒级数据访问,自动处理热点数据。 - L2 (Redis): 基于
StackExchange.Redis,提供分布式共享能力,确保数据一致性与持久化。 - Pub/Sub 实时同步: 利用 Redis 发布/订阅机制,当 L2 缓存更新时,实时通知所有节点清除对应的 L1 缓存,确保集群数据强一致性。
- L1 (内存): 基于
-
⚡ 高性能操作
- 批量操作: 支持
BatchGet,BatchPut,BatchEvict等批量 API,底层使用 Pipeline 减少网络往返 (RTT),大幅提升吞吐量。 - 序列化扩展: 支持 System.Text.Json (默认) 和 MemoryPack 等高效二进制序列化。
- 批量操作: 支持
-
🛡️ 高可用与容错
- 故障降级: Redis 不可用时自动降级为纯内存模式,保障服务不中断。
- 自动重连: 内置弹性的 Redis 断线重连机制。
- 防雪崩机制: 支持后台异步刷新和缓存预热,避免高并发下的缓存击穿。
- 并发控制: 内置内存锁 (SemaphoreSlim) 和分布式锁 (Redis Lock),有效防止缓存击穿 (Cache Stampede) 和并发写入冲突。
-
📊 全链路可观测性
- Metrics: 基于 OpenTelemetry 标准,开箱即用的 Prometheus/Grafana 监控指标。
- Tracing: 完整的分布式链路追踪支持,清晰洞察缓存命中与穿透路径。
- Logging: 结构化的缓存操作日志。
- HealthCheck: 集成 ASP.NET Core 健康检查,实时监控缓存组件状态。
-
🔌 灵活易用
- 开箱即用: 简洁的 API 设计,合理的默认配置,几行代码即可接入。
- Cache Aside: 推荐使用
L2CacheService基类,自动处理“缓存缺失回源”逻辑。 - 插件化: 支持自定义序列化(System.Text.Json, MemoryPack 等)和遥测实现。
| 文档 | 说明 |
|---|---|
| 快速入门 | 从零开始集成 L2Cache 到您的项目中 |
| 配置指南 | 详解所有配置选项与参数 |
| API 参考 | 核心接口与类的详细说明 |
| 架构设计 | 了解 L2Cache 的内部设计原理 |
| 高级特性 | 深入了解锁机制、并发控制与批量操作 |
通过 NuGet 安装核心包:
dotnet add package L2Cache根据需要安装扩展包:
# 遥测与健康检查 (Metrics, Tracing, HealthCheck)
dotnet add package L2Cache.Telemetry
# 高性能二进制序列化 (MemoryPack)
dotnet add package L2Cache.Serializers.MemoryPack在 Program.cs 中注册服务:
using L2Cache.Extensions;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddL2Cache(options =>
{
// 启用 L1 内存缓存
options.UseLocalCache = true;
// 启用 L2 Redis 缓存
options.UseRedis = true;
options.Redis.ConnectionString = builder.Configuration.GetConnectionString("Redis");
// 启用并发锁 (可选)
options.Lock.EnabledMemoryLock = true;
options.Lock.EnabledDistributedLock = true;
// 启用 Pub/Sub 消息订阅 (可选)
options.PubSub.Enabled = true;
})
.AddL2CacheTelemetry(); // 启用遥测定义并使用缓存服务:
public class ProductCacheService : L2CacheService<int, ProductDto>
{
private readonly IProductRepository _repo;
public ProductCacheService(
IServiceProvider sp,
IOptions<L2CacheOptions> opts,
ILogger<L2CacheService<int, ProductDto>> logger,
IProductRepository repo)
: base(sp, opts, logger)
{
_repo = repo;
}
// 定义缓存名称前缀
public override string GetCacheName() => "products";
// 定义 Key 的生成规则
public override string BuildCacheKey(int id) => id.ToString();
// 定义回源逻辑 (缓存未命中时调用)
public override async Task<ProductDto?> QueryDataAsync(int id)
{
return await _repo.GetByIdAsync(id);
}
}欢迎提交 Issue 和 Pull Request!
本项目采用 MIT 许可证。