C# 如何实现一个简单的缓存 - MemoryCache的使用
技术百科
月夜之吻
发布时间:2026-01-14
浏览: 次 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 虽然简单,但足够应对大多数内存缓存场景,
尤其适合中小型项目或不需要分布式缓存的情况。注意它只保存在当前进程内存中,重启即丢失,不适用于多服务器部署的共享缓存需求。
# ai
# 是一个
# 移除
# 但在
# 你可以
# windows
# 重启
# 适用于
# 已被
# 自定义
# 工具
# win
# c#
# 数据库
# .net
# 回调
# 数据丢失
# 封装
# wpf
# 命名空间
# 分钟后
# 分布式
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win10怎样安装Word样式库_Win10安装W
- 如何使用Golang实现跨域请求支持_Golang
- Win11怎么关闭自动调节亮度_Windows11
- Win11怎么关闭SmartScreen_禁用Wi
- Laravel 查询 JSON 列:高效筛选包含数
- 如何在JavaScript中动态拼接PHP的bas
- php订单日志怎么记录评价_php记录订单评价日志
- 如何在 Go 中可靠地测试含 time.Time
- 如何在Golang中实现WebSocket广播_使
- XAMPP 启动失败(Apache 突然停止)的终
- c++ std::atomic如何保证原子性 c+
- c++怎么使用类型萃取type_traits_c+
- Win11怎么设置触控板手势_Windows11三
- Windows蓝屏错误0x0000001E怎么修复
- Windows10无法识别USB设备描述符请求失败
- Python函数接口稳定性_版本演进解析【指导】
- Win10电脑怎么设置IP地址_Windows10
- 短链接怎么用php还原_从基础原理到代码实现教学【
- Windows10如何查看蓝屏日志_Win10使用
- Win11怎么关闭专注助手 Win11关闭免打扰模
- php485函数怎么捕获异常_php485错误处理
- 如何快速验证Golang安装是否成功_运行go v
- Win11怎么开启远程桌面_Win11系统远程桌面
- MAC的“接续互通”功能无法使用怎么办_MAC检查
- Win11笔记本怎么看电池健康度_Win11电池报
- Win11如何更改任务栏颜色 Win11自定义任务
- 如何在 Go 中正确反序列化多个同级 XML 元素
- Win11怎么制作U盘启动盘_Win11原版系统安
- Windows如何设置登录时的欢迎屏幕背景?(锁屏
- 如何在 Go 开发中正确处理本地包导入与远程模块路
- Windows10无法连接到Internet_Wi
- Win11如何关闭游戏模式 Win11禁用Xbox
- Go 中的 := 运算符:类型推导机制与使用边界详
- VSC怎样在VSC中调试PHPAPI_接口调试技巧
- Win11如何设置系统语言_Win11系统语言切换
- 如何在Golang中优化文件读写性能_使用缓冲和并
- LINUX的SELinux是什么_详解LINUX强
- Windows10如何更改盘符名称_Win10重命
- Win11怎么设置右键刷新选项_Windows11
- PHP中require语句后直接调用返回对象方法的
- 获取 PHP 文件最后修改时间的正确方法
- 如何在Golang中捕获JSON序列化错误_Gol
- Windows11怎样开启游戏模式_Windows
- Go 语言标准库为何不提供泛型 Contains
- php本地部署后session无法保存_sessi
- 如何使用Golang处理网络超时错误_Golang
- Mac版Final Cut Pro入门_Mac视频
- Win11摄像头无法使用怎么办_Win11相机隐私
- php中self::能调用子类重写的方法吗_静态绑
- php订单日志怎么在swoole写_php协程sw

尤其适合中小型项目或不需要分布式缓存的情况。注意它只保存在当前进程内存中,重启即丢失,不适用于多服务器部署的共享缓存需求。
QQ客服