下面给你整理一份 《使用 .NET 标准库实现内存缓存机制的详细过程》,适用于:
✔ .NET Standard
✔ .NET Core / .NET 5-8
✔ 控制台 / Web / 服务 / SDK 类库
无任何第三方依赖(只用标准库)。
⭐ 一、.NET 标准库并没有内置 MemoryCache?
有!
你可以使用:
System.Runtime.Caching.MemoryCache
该命名空间在 .NET Standard 2.0+、.NET Framework、.NET Core 都可用(由兼容包支持)。
✔ 支持缓存依赖
✔ 支持过期策略
✔ 支持优先级
✔ 支持缓存项移除回调
✔ 企业级成熟方案
⭐ 二、安装(仅 .NET Core / .NET 5-8 需要)
dotnet add package System.Runtime.Caching
.NET Framework 自带,无需安装。
⭐ 三、MemoryCache 的基本用法
1. 创建缓存实例(单例)
using System.Runtime.Caching;
var cache = MemoryCache.Default;
2. 放入缓存
cache.Set("user_1", "Jack", DateTimeOffset.Now.AddMinutes(10));
带过期时间。
3. 读取缓存
var name = cache.Get("user_1");
4. 删除缓存
cache.Remove("user_1");
⭐ 四、MemoryCache 完整示例:带策略、回调
using System;
using System.Runtime.Caching;
class Program
{
static void Main()
{
var cache = MemoryCache.Default;
var policy = new CacheItemPolicy
{
AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10),
// 缓存被移除时回调
RemovedCallback = (args) =>
{
Console.WriteLine($"缓存被移除:{args.CacheItem.Key}, 原因:{args.RemovedReason}");
}
};
cache.Set("token", "ABCDEFG", policy);
Console.WriteLine("已写入缓存 token=ABCDEFG");
Console.WriteLine("按任意键继续…等待过期");
Console.ReadKey();
var token = cache.Get("token");
Console.WriteLine($"读取 token: {token ?? "已过期"}");
}
}
功能:
✔ 添加缓存
✔ 10秒后自动过期
✔ 移除回调自动触发
⭐ 五、过期策略:AbsoluteExpiration vs SlidingExpiration
1. AbsoluteExpiration(绝对过期)
在指定时间后失效:
policy.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(5);
适用:
✔ Token
✔ 临时数据
✔ 强制更新的数据
2. SlidingExpiration(滑动过期)
在 每次访问后延长过期时间:
policy.SlidingExpiration = TimeSpan.FromMinutes(10);
适用:
✔ 活跃用户会话
✔ 经常访问的数据
✔ 页面缓存
⭐ 六、优先级控制 (CacheItemPriority)
policy.Priority = CacheItemPriority.NotRemovable;
防止内存紧张时被回收。
⭐ 七、检查缓存是否存在
if (cache.Contains("user_1"))
{
var value = cache.Get("user_1");
}
⭐ 八、存储复杂类型
cache["user"] = new User { Id = 1, Name = "Jack" };
只要不是 Span, ref struct,都可以。
⭐ 九、缓存依赖(文件依赖示例)
缓存项会在文件变更后自动移除。
policy.ChangeMonitors.Add(
new HostFileChangeMonitor(new List<string> { "config.json" })
);
适用:
✔ 配置文件自动热更新
✔ 模板更新自动刷新缓存
⭐ 十、封装一个 CacheHelper(项目通用)
public static class CacheHelper
{
private static readonly MemoryCache _cache = MemoryCache.Default;
public static T GetOrCreate<T>(string key, Func<T> factory, int seconds = 60)
{
if (_cache.Contains(key))
return (T)_cache.Get(key);
var value = factory();
_cache.Set(key, value,
DateTimeOffset.Now.AddSeconds(seconds));
return value;
}
}
调用:
var user = CacheHelper.GetOrCreate("user_1", () =>
{
Console.WriteLine("从数据库获取用户...");
return new User { Id = 1, Name = "Jack" };
});
✔ 第一次从数据库读
✔ 之后都从缓存读
✔ 简洁高效
⭐ 十一、MemoryCache vs ASP.NET Core IMemoryCache
| 功能 | MemoryCache (标准库) | IMemoryCache (.NET Core) |
|---|---|---|
| .NET Standard 支持 | ✔ | ❌ |
| 支持文件依赖 | ✔ | ❌ |
| 支持优先级 | ✔ | ✔ |
| 支持过期策略 | ✔ | ✔ |
| 可用于控制台 / 服务 | ✔ | ❌ |
| ASP.NET Core 集成 | 一般 | 原生 |
如果你在写 类库、SDK、Console、Windows Service、跨框架库 → 用 MemoryCache。
如果你在写 ASP.NET Core Web 项目 → 优先用 IMemoryCache。
🎯 总结(最重要)
要在 .NET 标准库 实现缓存,最佳方案是:
✔ 使用 System.Runtime.Caching.MemoryCache
无需第三方库
跨版本兼容
功能强大
稳定成熟
发表回复