使用缓存避免重复查询,C#常用MemoryCache和Redis;单机用MemoryCache,集群用Redis,结合LazyCache等库简化操作,建议合理设计键名、过期时间和更新策略。

在C#中实现数据库查询的缓存,核心思路是避免重复执行相同查询,将结果暂存内存或分布式存储中。常见做法是结合缓存库与业务逻辑控制缓存的读取、写入和过期。
常用缓存方式与库
C#项目中常用的缓存实现方式和库包括:1. MemoryCache(内置内存缓存)
.NET Framework 和 .NET Core 都提供了 MemoryCache 类,适合单机部署场景。
var cache = new MemoryCache(new MemoryCacheOptions()); var cacheKey = "users_list";
if (!cache.TryGetValue(cacheKey, out List
// 写入缓存,设置过期时间
var cacheEntryOptions = new MemoryCacheEntryOptions()
.SetAbsoluteExpiration(TimeSpan.FromMinutes(10));
cache.Set(cacheKey, users, cacheEntryOptions);}
2. Redis(分布式缓存)
安装 NuGet 包:
适用于多实例部署、需要共享缓存的场景。常用库是 StackExchange.Redis。Install-Package StackExchange.Redis使用示例: ```csharp using StackExchange.Redis; var redis = ConnectionMultiplexer.Connect("localhost:6379"); var db = redis.GetDatabase(); var cacheKey = "users_list"; var cachedData = db.StringGet(cacheKey); if (cachedData.IsNullOrEmpty) { var users = dbContext.Users.ToList(); var json = JsonSerializer.Serialize(users); db.StringSet(cacheKey, json, TimeSpan.FromMinutes(10)); } else { var users = JsonSerializer.Deserialize>(cachedData); }
3. 使用第三方封装库简化操作
- Microsoft.Extensions.Caching.StackExchangeRedis:官方封装,提供统一接口。 - LazyCache:简化 MemoryCache 的使用,支持异步缓存获取。 - CacheManager:功能更全面,支持多层缓存(如内存 + Redis)。以 LazyCache 为例:
using LazyCache; var cache = new CachingService(); var users = cache.GetOrAdd("users_list", () => dbContext.Users.ToList(), TimeSpan.FromMinutes(10));缓存策略建议
实际应用中需注意以下几点:
- 为缓存键设计清晰命名规则,例如
entity:query:condition- 设置合理的过期时间,防止数据长期不更新
- 在数据变更时主动清除相关缓存(如增删改后清理查询缓存)
- 对高频但低变化的查询优先缓存,如配置表、字典数据
- 考虑使用缓存穿透保护(如空值缓存)和限流机制
是否使用 ORM 自带缓存?
Entity Framework 不推荐依赖其一级/二级缓存机制做查询缓存,因其生命周期绑定上下文,控制复杂。建议在服务层手动管理缓存,逻辑更清晰可控。基本上就这些。根据项目规模选择合适方案:小项目用 MemoryCache,大项目或集群用 Redis。










