在C#中实现数据库查询的缓存,核心思路是避免重复执行相同查询,将结果暂存内存或分布式存储中。常见做法是结合缓存库与业务逻辑控制缓存的读取、写入和过期。
常用缓存方式与库
C#项目中常用的缓存实现方式和库包括:1. MemoryCache(内置内存缓存)
.NET Framework 和 .NET Core 都提供了
MemoryCache类,适合单机部署场景。 使用示例: ```csharp using Microsoft.Extensions.Caching.Memory;
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);}
<p><strong>2. Redis(分布式缓存)</strong><br> 适用于多实例部署、需要共享缓存的场景。常用库是 <strong>StackExchange.Redis</strong>。</p> <font color="#000000">安装 NuGet 包:</font> <pre class="brush:php;toolbar:false;">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。
