TypechoJoeTheme

至尊技术网

统计
登录
用户名
密码

C怎么使用MemoryCache实现内存缓存

2025-11-16
/
0 评论
/
2 阅读
/
正在检测是否收录...
11/16


在现代软件开发中,性能优化是不可忽视的一环。尤其是在处理高频访问的数据时,频繁读取数据库或远程服务会显著影响响应速度。为了缓解这一问题,C# 提供了 MemoryCache 类,作为 .NET Framework 和 .NET Core/.NET 5+ 中内置的内存缓存解决方案。它能够将常用数据存储在服务器内存中,实现快速读取,从而有效减少资源消耗和响应延迟。

MemoryCache 位于 System.Runtime.Caching 命名空间下(注意:.NET Core 起需通过 NuGet 包 Microsoft.Extensions.Caching.Memory 引入),是一个线程安全的缓存类,适用于桌面应用、Web 应用以及后台服务等多种场景。

要开始使用 MemoryCache,首先需要创建一个缓存实例。在大多数情况下,推荐使用单例模式来管理缓存对象,避免重复创建带来的资源浪费:

csharp
using System.Runtime.Caching;

private static readonly ObjectCache _cache = MemoryCache.Default;

这里我们直接使用了 MemoryCache.Default,它是框架提供的默认缓存实例。当然,你也可以自定义配置:

csharp var config = new NameValueCollection { { "pollingInterval", "00:05:00" } }; var cache = new MemoryCache("MyCustomCache", config);

缓存的基本操作包括添加、获取和移除。例如,将一个字符串写入缓存并设置10分钟的过期时间:

csharp _cache.Set("username", "zhangsan", DateTimeOffset.Now.AddMinutes(10));

获取缓存值时,建议先判断是否存在,再进行类型转换:

csharp if (_cache.Contains("username")) { string name = _cache.Get("username") as string; Console.WriteLine($"用户名:{name}"); }

更安全的做法是使用 TryGetValue 方法:

csharp if (_cache.TryGetValue("username", out object value)) { string name = value as string; }

除了简单的绝对过期时间,MemoryCache 还支持滑动过期策略(Sliding Expiration)。这种策略会在每次访问缓存项时重置过期时间,适合用于“最近活跃用户”这类需要动态维持的数据:

csharp var policy = new CacheItemPolicy { SlidingExpiration = TimeSpan.FromMinutes(5) }; _cache.Set("session_123", userData, policy);

此外,还可以设置缓存依赖,比如文件依赖或键依赖。当某个文件发生变化时,相关缓存自动失效:

csharp
var filePath = @"C:\config\settings.json";
var fileRef = new ChangeMonitor[] { new HostFileChangeMonitor(new List { filePath }) };

var policyWithDependency = new CacheItemPolicy
{
AbsoluteExpiration = DateTimeOffset.Now.AddHours(1),
ChangeMonitors = { fileRef }
};

_cache.Set("appSettings", LoadSettings(), policyWithDependency);

在 ASP.NET 或 ASP.NET Core 项目中,虽然推荐使用 IMemoryCache 接口配合依赖注入的方式(更加灵活且易于测试),但在一些小型项目或 WinForms/WPF 应用中,直接使用 MemoryCache 依然是一种简洁高效的选择。

值得注意的是,MemoryCache 是基于内存的,因此不适合存储大量数据或持久化关键信息。一旦应用程序重启,所有缓存数据都会丢失。同时,应避免缓存生命周期过长的对象,防止内存泄漏。

实际开发中,常见的应用场景包括:缓存数据库查询结果、API 响应数据、配置信息、权限菜单等。例如,在用户登录后将其角色信息缓存起来,后续权限校验无需反复查询数据库:

csharp
public List GetUserRoles(int userId)
{
var cacheKey = $"userroles{userId}";
if (_cache.TryGetValue(cacheKey, out object cached))
return (List)cached;

var roles = QueryDatabaseForRoles(userId); // 模拟数据库查询
var policy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(20) };
_cache.Set(cacheKey, roles, policy);

return roles;

}

通过合理使用 MemoryCache,不仅能显著提升系统响应速度,还能降低后端服务的压力。掌握其核心机制和最佳实践,是每一位 C# 开发者构建高性能应用的重要技能之一。

C#性能优化ASP.NET内存缓存MemoryCache数据缓存CacheItemPolicy
朗读
赞(0)
版权属于:

至尊技术网

本文链接:

https://www.zzwws.cn/archives/38802/(转载时请注明本文出处及文章链接)

评论 (0)

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月

最新回复

  1. 强强强
    2025-04-07
  2. jesse
    2025-01-16
  3. sowxkkxwwk
    2024-11-20
  4. zpzscldkea
    2024-11-20
  5. bruvoaaiju
    2024-11-14

标签云