悠悠楠杉
C怎么使用MemoryCache实现内存缓存
在现代软件开发中,性能优化是不可忽视的一环。尤其是在处理高频访问的数据时,频繁读取数据库或远程服务会显著影响响应速度。为了缓解这一问题,C# 提供了 MemoryCache 类,作为 .NET Framework 和 .NET Core/.NET 5+ 中内置的内存缓存解决方案。它能够将常用数据存储在服务器内存中,实现快速读取,从而有效减少资源消耗和响应延迟。
MemoryCache 位于 System.Runtime.Caching 命名空间下(注意:.NET Core 起需通过 NuGet 包 Microsoft.Extensions.Caching.Memory 引入),是一个线程安全的缓存类,适用于桌面应用、Web 应用以及后台服务等多种场景。
要开始使用 MemoryCache,首先需要创建一个缓存实例。在大多数情况下,推荐使用单例模式来管理缓存对象,避免重复创建带来的资源浪费:
csharp
using System.Runtime.Caching;
private static readonly ObjectCache _cache = MemoryCache.Default;
这里我们直接使用了 MemoryCache.Default,它是框架提供的默认缓存实例。当然,你也可以自定义配置:
csharp
var config = new NameValueCollection { { "pollingInterval", "00:05:00" } };
var cache = new MemoryCache("MyCustomCache", config);
缓存的基本操作包括添加、获取和移除。例如,将一个字符串写入缓存并设置10分钟的过期时间:
csharp
_cache.Set("username", "zhangsan", DateTimeOffset.Now.AddMinutes(10));
获取缓存值时,建议先判断是否存在,再进行类型转换:
csharp
if (_cache.Contains("username"))
{
string name = _cache.Get("username") as string;
Console.WriteLine($"用户名:{name}");
}
更安全的做法是使用 TryGetValue 方法:
csharp
if (_cache.TryGetValue("username", out object value))
{
string name = value as string;
}
除了简单的绝对过期时间,MemoryCache 还支持滑动过期策略(Sliding Expiration)。这种策略会在每次访问缓存项时重置过期时间,适合用于“最近活跃用户”这类需要动态维持的数据:
csharp
var policy = new CacheItemPolicy
{
SlidingExpiration = TimeSpan.FromMinutes(5)
};
_cache.Set("session_123", userData, policy);
此外,还可以设置缓存依赖,比如文件依赖或键依赖。当某个文件发生变化时,相关缓存自动失效:
csharp
var filePath = @"C:\config\settings.json";
var fileRef = new ChangeMonitor[] { new HostFileChangeMonitor(new List
var policyWithDependency = new CacheItemPolicy
{
AbsoluteExpiration = DateTimeOffset.Now.AddHours(1),
ChangeMonitors = { fileRef }
};
_cache.Set("appSettings", LoadSettings(), policyWithDependency);
在 ASP.NET 或 ASP.NET Core 项目中,虽然推荐使用 IMemoryCache 接口配合依赖注入的方式(更加灵活且易于测试),但在一些小型项目或 WinForms/WPF 应用中,直接使用 MemoryCache 依然是一种简洁高效的选择。
值得注意的是,MemoryCache 是基于内存的,因此不适合存储大量数据或持久化关键信息。一旦应用程序重启,所有缓存数据都会丢失。同时,应避免缓存生命周期过长的对象,防止内存泄漏。
实际开发中,常见的应用场景包括:缓存数据库查询结果、API 响应数据、配置信息、权限菜单等。例如,在用户登录后将其角色信息缓存起来,后续权限校验无需反复查询数据库:
csharp
public List
{
var cacheKey = $"userroles{userId}";
if (_cache.TryGetValue(cacheKey, out object cached))
return (List
var roles = QueryDatabaseForRoles(userId); // 模拟数据库查询
var policy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(20) };
_cache.Set(cacheKey, roles, policy);
return roles;
}
通过合理使用 MemoryCache,不仅能显著提升系统响应速度,还能降低后端服务的压力。掌握其核心机制和最佳实践,是每一位 C# 开发者构建高性能应用的重要技能之一。

