C# 如何实现一个简单的缓存 - MemoryCache的使用

来源:这里教程网 时间:2026-02-21 17:38:02 作者:

在 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;
<p>// 获取默认的缓存实例
ObjectCache cache = MemoryCache.Default;</p><p>// 添加一个字符串到缓存,10分钟后过期
cache.Set("username", "zhangsan", DateTimeOffset.Now.AddMinutes(10));</p><p>// 从缓存读取数据
string username = cache.Get("username") as string;
if (username != null)
{
Console.WriteLine($"缓存命中: {username}");
}
else
{
Console.WriteLine("缓存未命中");
}
</p>

设置缓存过期策略

你可以更灵活地控制缓存的生命周期,例如使用相对过期时间或绝对过期时间。

相对过期:从添加时刻起,一段时间后失效。 绝对过期:指定一个具体的时间点失效。

示例:

// 相对过期:20分钟后过期
cache.Set("data1", "value1", TimeSpan.FromMinutes(20));
<p>// 绝对过期:指定具体时间
cache.Set("data2", "value2", new CacheItemPolicy
{
AbsoluteExpiration = DateTimeOffset.Now.AddHours(1)
});
</p>

高级用法:自定义缓存策略

通过 CacheItemPolicy 可以设置更多选项,比如滑动过期、依赖文件、缓存移除回调等。

cache.Set("report", GenerateReport(), new CacheItemPolicy
{
    // 滑动过期:如果10分钟内被访问,则自动延长
    SlidingExpiration = TimeSpan.FromMinutes(10),
<pre class="brush:php;toolbar:false;">// 缓存被移除时触发回调
RemovedCallback = args =>
{
    Console.WriteLine($"缓存项 {args.Key} 已被移除,原因: {args.RemovedReason}");
}

});

封装成通用缓存帮助类

为了方便在项目中复用,可以封装一个简单的缓存工具类:

public class SimpleCacheService
{
    private readonly ObjectCache _cache = MemoryCache.Default;
<pre class="brush:php;toolbar:false;">public T Get<T>(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<DateTime>("time");

基本上就这些。MemoryCache 虽然简单,但足够应对大多数内存缓存场景,尤其适合中小型项目或不需要分布式缓存的情况。注意它只保存在当前进程内存中,重启即丢失,不适用于多服务器部署的共享缓存需求。

相关推荐