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

11次阅读

MemoryCache 是 .net 内置内存缓存,适用于单进程场景;需在 .NET Core+ 中安装 System.Runtime.Caching 包;支持相对/绝对/滑动过期及移除回调;重启后数据丢失,不支持分布式共享。

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

在 C# 开发中,为了提升性能,避免重复计算或频繁访问数据库、远程服务,我们常常需要使用缓存。.NET 提供了一个内置的内存缓存实现 —— MemoryCache,它位于 System.Runtime.Caching 命名空间下,适用于桌面应用(如 wpfwindows 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 虽然简单,但足够应对大多数内存缓存场景,尤其适合中小型项目或不需要分布式缓存的情况。注意它只保存在当前进程内存中,重启即丢失,不适用于多服务器部署的共享缓存需求。

text=ZqhQzanResources