C# (.NET) 中的缓存:Redis、MemoryCache 及其他解决方案

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C# (.NET) 中的缓存:Redis、MemoryCache 及其他工具



在现代高负载的 C# (.NET) 应用程序中,缓存是提升性能并降低数据库负载的关键机制之一。本文将详细介绍 .NET 生态系统中的主要缓存工具:内置的 MemoryCache、基于 Redis 并通过 StackExchange.Redis 库实现的分布式缓存,以及 IDistributedCache 抽象层。



1. 内置缓存:MemoryCache



MemoryCache(命名空间 Microsoft.Extensions.Caching.Memory)是一种将数据直接缓存在进程内存中的最简单方式。它非常适合单进程应用程序(例如,未进行扩展的 ASP.NET Core)。



基本使用示例:



using Microsoft.Extensions.Caching.Memory;

// 创建缓存IMemoryCache cache = new MemoryCache(new MemoryCacheOptions());

// 写入缓存,设置5分钟过期时间cache.Set("user:123", new User { Id = 123, Name = "伊万" }, TimeSpan.FromMinutes(5));

// 从缓存读取if (cache.TryGetValue("user:123", out User user)){ Console.WriteLine($"用户: {user.Name}");}else{ Console.WriteLine("缓存为空,从数据库加载...");}


优点: 速度极快,零网络延迟,配置简单。
缺点: 数据仅存在于单个进程中,应用程序重启后数据丢失。



2. 分布式缓存:Redis + StackExchange.Redis



对于分布式系统(多台服务器、微服务),需要外部缓存。Redis 是最流行的选择。在 .NET 中与 Redis 交互的主要库是 StackExchange.Redis(在 GitHub 上拥有超过 6000 颗星)。



安装:



dotnet add package StackExchange.Redis


Redis 使用示例:



using StackExchange.Redis;

// 连接到 RedisConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379");IDatabase db = redis.GetDatabase();

// 写入字符串并设置 TTL(过期时间)db.StringSet("session:token123", "user_data_here", TimeSpan.FromHours(1));

// 读取string data = db.StringGet("session:token123");if (!string.IsNullOrEmpty(data)){ Console.WriteLine($"缓存中的数据: {data}");}

// 缓存复杂对象(序列化为 JSON)var product = new Product { Id = 1, Name = "笔记本电脑", Price = 75000 };string json = System.Text.Json.JsonSerializer.Serialize(product);db.StringSet("product:1", json, TimeSpan.FromMinutes(10));

// 读取时反序列化string cachedJson = db.StringGet("product:1");var cachedProduct = System.Text.Json.JsonSerializer.Deserialize<Product>(cachedJson);


Redis 的其他功能:

  • 哈希(Hashes) — 用于存储带有字段的对象(例如,用户资料)。
  • 列表和集合 — 用于队列、排行榜。
  • 发布/订阅(Pub/Sub) — 用于缓存失效通知。
  • Lua 脚本 — 原子操作。


3. IDistributedCache 抽象层



Microsoft 提供了 IDistributedCache 接口(包 Microsoft.Extensions.Caching.Abstractions),它允许在不更改应用程序代码的情况下切换不同的缓存实现。



实现方式:

  • MemoryDistributedCache — 用于开发和测试(存储在内存中)。
  • RedisCache(包 Microsoft.Extensions.Caching.StackExchangeRedis) — 用于生产环境。
  • SqlServerCache

推荐