编辑
2025-09-25
C#
00

目录

摘要
正文

摘要

缓存是一种非常常见的性能优化技术,在开发过程中经常会用到。.NET提供了内置的内存缓存类 MemoryCache,它可以很方便地存储数据并在后续的请求中快速读取,从而提高应用程序的响应速度。

正文

通过使用 Microsoft.Extensions.Caching.Memory,我们可以在 .NET Core 中轻松实现内存缓存功能,从而提高应用程序的性能和响应速度。在实际应用中,你可以根据具体需求来设置缓存的有效期和其他选项。

nuget 安装依赖 Microsoft.Extensions.Caching.Memory

image.png

一个简单例子

C#
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"); } } }

image.png

C#
/// <summary> /// 删除cache /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnDeleteCache_Click(object sender, EventArgs e) { cache.Remove("hi"); }

缓存一个对象

C#
public class Person { public string Name { get; set; } public int Age { get; set; } public override string ToString() { return this.Name+" "+this.Age.ToString(); } }
C#
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"); } }

image.png

侦听几个事件,使用PostEvictionCallbacks这个回调

C#
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,这里能知道是什么操作

C#
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, }

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!