C# (.NET) 中的缓存:Redis、MemoryCache 及其他替代方案
缓存是提升 C# (.NET) 应用程序性能的关键工具之一。它可以减少响应时间、降低数据库负载并节省基础设施成本。本文将介绍 .NET 内置机制、基于 Redis 的流行实现,以及 NCache 和 Couchbase 等替代方案。
1. 内置缓存:MemoryCache
MemoryCache(命名空间 Microsoft.Extensions.Caching.Memory)是一种简单快速的缓存,将数据存储在单个进程的内存中。它非常适合单线程应用或单实例 Web 服务器。
安装与配置
dotnet add package Microsoft.Extensions.Caching.Memory基本使用示例
using Microsoft.Extensions.Caching.Memory;
public class DataService{ private readonly IMemoryCache _cache; private readonly TimeSpan _cacheDuration = TimeSpan.FromMinutes(5);
public DataService(IMemoryCache cache) => _cache = cache;
public async Task<string> GetDataAsync(string key) { if (!_cache.TryGetValue(key, out string cachedData)) { cachedData = await FetchFromDatabaseAsync(key); _cache.Set(key, cachedData, new MemoryCacheEntryOptions { AbsoluteExpirationRelativeToNow = _cacheDuration }); } return cachedData; }}优点与缺点
- + 简单,零网络延迟。
- + 内置过期支持(绝对/滑动)。
- - 无法在扩展到多台服务器时工作。
- - 应用程序重启时缓存被清除。
2. 分布式缓存:Redis
Redis 是 .NET 生态系统中分布式缓存最流行的选择。它作为一个独立服务运行,可供所有应用程序实例访问。在 .NET 中使用 IDistributedCache 抽象。
安装包
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis在 Program.cs 中配置
builder.Services.AddStackExchangeRedisCache(options =>{ options.Configuration = "localhost:6379"; options.InstanceName = "MyAppCache";});使用 IDistributedCache 的示例
public class RedisCacheService{ private readonly IDistributedCache _cache;
public RedisCacheService(IDistributedCache cache) => _cache = cache;
public async Task SetAsync(string key, byte[] data, int minutes = 10) { await _cache.SetAsync(key, data, new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(minutes) }); }
public async Task<byte[]> GetAsync(string key) { return await _cache.GetAsync(key); }}Redis 的高级功能
- 对象序列化:使用
System.Text.Json或Newtonsoft.Json。 - 按标签失效:第三方库(例如
EasyCaching.Redis)允许对条目进行分组。 - Pub/Sub:用于缓存更改通知。
3. Redis 的替代方案
3.1 NCache
NCache 是一个商业解决方案(有免费版本),支持 .NET。它提供高级功能:节点间同步、类似 SQL 的缓存查询、ASP.NET 会话缓存。
- + 内置支持
IDist