下面给你整理一份 《使用 .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

无需第三方库
跨版本兼容
功能强大
稳定成熟