MemoryCache 是 .net 内置内存缓存,适用于单进程场景;需在 .NET Core+ 中安装 System.Runtime.Caching 包;支持相对/绝对/滑动过期及移除回调;重启后数据丢失,不支持分布式共享。

在 C# 开发中,为了提升性能,避免重复计算或频繁访问数据库、远程服务,我们常常需要使用缓存。.NET 提供了一个内置的内存缓存实现 —— MemoryCache,它位于 System.Runtime.Caching 命名空间下,适用于桌面应用(如 wpf、windows Service)和 ASP.NET 应用。
启用 MemoryCache
MemoryCache 是 .NET Framework 4.0+ 自带的组件,在 .NET Framework 项目中可直接使用。但在 .NET Core 或 .NET 5+ 中,你需要先安装 NuGet 包:
Install-Package System.Runtime.Caching
这个包在大多数现代项目中默认已包含。
基本使用方法
下面是一个简单的 MemoryCache 使用示例:
using System; using System.Runtime.Caching; // 获取默认的缓存实例 ObjectCache cache = MemoryCache.Default;
// 添加一个字符串到缓存,10分钟后过期 cache.Set("username", "zhangsan", DateTimeOffset.Now.AddMinutes(10));
// 从缓存读取数据 string username = cache.Get("username") as string; if (username != null) { Console.WriteLine($"缓存命中: {username}"); } else { Console.WriteLine("缓存未命中"); }
设置缓存过期策略
你可以更灵活地控制缓存的生命周期,例如使用相对过期时间或绝对过期时间。
- 相对过期:从添加时刻起,一段时间后失效。
- 绝对过期:指定一个具体的时间点失效。
示例:
// 相对过期:20分钟后过期 cache.Set("data1", "value1", TimeSpan.FromMinutes(20)); // 绝对过期:指定具体时间 cache.Set("data2", "value2", new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddHours(1) });
高级用法:自定义缓存策略
通过 CacheItemPolicy 可以设置更多选项,比如滑动过期、依赖文件、缓存移除回调等。
cache.Set("report", GenerateReport(), new CacheItemPolicy { // 滑动过期:如果10分钟内被访问,则自动延长 SlidingExpiration = TimeSpan.FromMinutes(10), // 缓存被移除时触发回调 RemovedCallback = args => { Console.WriteLine($"缓存项 {args.Key} 已被移除,原因: {args.RemovedReason}"); }
});
封装成通用缓存帮助类
为了方便在项目中复用,可以封装一个简单的缓存工具类:
public class SimpleCacheService { private readonly ObjectCache _cache = MemoryCache.Default; public T Get(string key) { return (T)_cache.Get(key); } public void Set(string key, object value, TimeSpan expiration) { _cache.Set(key, value, DateTimeOffset.Now.Add(expiration)); } public bool Contains(string key) { return _cache.Contains(key); } public void Remove(string key) { if (_cache.Contains(key)) { _cache.Remove(key); } }
}
使用方式:
var cacheService = new SimpleCacheService(); cacheService.Set("time", DateTime.Now, TimeSpan.FromMinutes(5)); var time = cacheService.Get("time");
基本上就这些。MemoryCache 虽然简单,但足够应对大多数内存缓存场景,尤其适合中小型项目或不需要分布式缓存的情况。注意它只保存在当前进程内存中,重启即丢失,不适用于多服务器部署的共享缓存需求。