摘要
缓存是一种非常常见的性能优化技术,在开发过程中经常会用到。.NET提供了内置的内存缓存类 MemoryCache,它可以很方便地存储数据并在后续的请求中快速读取,从而提高应用程序的响应速度。
正文
通过使用 Microsoft.Extensions.Caching.Memory,我们可以在 .NET Core 中轻松实现内存缓存功能,从而提高应用程序的性能和响应速度。在实际应用中,你可以根据具体需求来设置缓存的有效期和其他选项。
nuget 安装依赖 Microsoft.Extensions.Caching.Memory

一个简单例子
public partial class Form1 : Form{// 创建 MemoryCache 实例MemoryCache cache = new MemoryCache(new MemoryCacheOptions());System.Timers.Timer timer = new System.Timers.Timer();int idx = 0;public Form1(){InitializeComponent();timer.Interval = 1000;timer.Elapsed += (o, e) =>{this.Invoke(new Action(() =>{lblTime.Text = idx.ToString();idx++;}));};}private void btnCreateCache_Click(object sender, EventArgs e){// 添加数据到缓存string key = "hi";string value = "Hello, World!";var cacheEntryOptions = new MemoryCacheEntryOptions{AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(1) // 缓存有效期为 1 分钟};cache.Set(key, value, cacheEntryOptions);timer.Start();}private void btnGetCache_Click(object sender, EventArgs e){// 从缓存中获取数据if (cache.TryGetValue("hi", out string cachedValue)){MessageBox.Show(cachedValue);}else{MessageBox.Show("没有找到cache");}}}

/// <summary>/// 删除cache/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnDeleteCache_Click(object sender, EventArgs e){cache.Remove("hi");}
缓存一个对象
public class Person{public string Name { get; set; }public int Age { get; set; }public override string ToString(){return this.Name+" "+this.Age.ToString();}}
public partial class Form1 : Form{// 创建 MemoryCache 实例MemoryCache cache = new MemoryCache(new MemoryCacheOptions());System.Timers.Timer timer = new System.Timers.Timer();int idx = 0;public Form1(){InitializeComponent();timer.Interval = 1000;timer.Elapsed += (o, e) =>{this.Invoke(new Action(() =>{lblTime.Text = idx.ToString();idx++;}));};}private void btnCreateCache_Click(object sender, EventArgs e){Person person = new Person(){Name="Rick",Age=99};// 添加对像数据到缓存var cacheEntryOptions = new MemoryCacheEntryOptions{AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(1) // 缓存有效期为 1 分钟};cache.Set<Person>("p1", person);timer.Start();}private void btnGetCache_Click(object sender, EventArgs e){// 从缓存中获取数据if (cache.TryGetValue<Person>("p1", out Person cachedValue)){MessageBox.Show(cachedValue.ToString());}else{MessageBox.Show("没有找到cache");}}/// <summary>/// 删除cache/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnDeleteCache_Click(object sender, EventArgs e){cache.Remove("p1");}}

侦听几个事件,使用PostEvictionCallbacks这个回调
private void btnCreateCache_Click(object sender, EventArgs e){Person person = new Person(){Name="Rick",Age=99};// 添加对像数据到缓存var cacheEntryOptions = new MemoryCacheEntryOptions{AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(1), // 缓存有效期为 1 分钟PostEvictionCallbacks ={new PostEvictionCallbackRegistration{EvictionCallback=Cache_EntryRemoved,State =this}}};cache.Set<Person>("p1", person, cacheEntryOptions);timer.Start();}private static void Cache_EntryRemoved(object key, object value, EvictionReason reason, object state){// 在 PostEvictionCallback 中处理逻辑switch (reason.ToString()){case "Delete":MessageBox.Show("删除缓存了!");break;default:break;}}
注意Reason,这里能知道是什么操作
public enum EvictionReason{None,/// <summary>/// Manually/// </summary>Removed,/// <summary>/// Overwritten/// </summary>Replaced,/// <summary>/// Timed out/// </summary>Expired,/// <summary>/// Event/// </summary>TokenExpired,/// <summary>/// Overflow/// </summary>Capacity,}