MemoryCache 是 .NET Core 中的一种缓存机制,它提供了一个简单且易于使用的方式,用于存储在内存中的缓存数据。缓存数据可以在应用程序的整个运行时间内被共享,也可以用于临时存储数据。
下面是关于 MemoryCache 的一些详细介绍:
1. 引入命名空间
使用 MemoryCache 时,需要引入 Microsoft.Extensions.Caching.Memory 命名空间,如下所示:
using Microsoft.Extensions.Caching.Memory;
2. 创建 MemoryCache 对象
在代码中创建 MemoryCache 对象的示例代码如下所示:
IMemoryCache cache = new MemoryCache(new MemoryCacheOptions());
在创建 MemoryCache 对象时,还可以通过 MemoryCacheOptions 参数进行配置,如下所示:
IMemoryCache cache = new MemoryCache(
new MemoryCacheOptions
{
SizeLimit = 1024 // 设置缓存大小限制
});
3. 添加数据到 MemoryCache
可以通过 Set 方法将数据添加到 MemoryCache 中,示例代码如下所示:
// 添加一个字符串对象到 MemoryCache,有效期为20分钟
cache.Set("mykey", "Hello, world!", TimeSpan.FromMinutes(20));
4. 从 MemoryCache 中获取数据
通过 Get 方法可以从 MemoryCache 中获取数据,示例代码如下所示:
// 获取上面添加的字符串对象
if (cache.TryGetValue("mykey", out string value))
{
Console.WriteLine(value); // 输出 "Hello, world!"
}
5. 从 MemoryCache 中删除数据
可以通过 Remove 方法从 MemoryCache 中删除指定的缓存数据,示例代码如下所示:
// 移除上面添加的缓存数据
cache.Remove("mykey");
6. MemoryCache 中的缓存策略
MemoryCache 中的缓存策略有两种:基于时间的缓存和基于大小的缓存。
基于时间的缓存:内置到 MemoryCache 中。可以通过 Set 方法,指定该缓存项的有效期,达到时间后缓存项将失效。
基于大小的缓存:限制缓存项的数量或者缓存占用内存大小来达到清理缓存项的目的。可以通过 MemoryCacheOptions 的 SizeLimit 属性和 DisposalChaperPercentage 属性来设置。SizeLimit 表示最大缓存大小(以字节为单位),DisposalChaperPercentage 表示当缓存项的大小大于缓存大小限制时,需要移除的缓存项的百分比。
7. MemoryCache 的回收机制
当缓存项失效或者内存达到缓存容量上限时,缓存管理器将删除一些缓存项。删除缓存项的策略通常由以下两个因素决定:
最长非活动时限:对于运行时间较长的应用程序,为缓解缓存占用的内存,应使用基于时间的回收机制。可以设置缓存项的生命周期,并在生命周期到期后删除它们。
LRU 策略:为了防止 MemoryCache 占用过多内存,应使用 LRU 回收机制,删除最近最少使用的缓存项。当内存不足并且缓存大小已达到设置的上限时,MemoryCache 将启动此回收机制。
8. 例:基于时间的缓存示例
IMemoryCache cache = new MemoryCache(new MemoryCacheOptions());
var cacheEntryOptions = new MemoryCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromSeconds(10)); // 指定缓存条目的滑动过期时间为 10 秒
cache.Set("mykey", "Hello, world!", cacheEntryOptions);
// 尝试获取缓存值。并根据缓存是否过期 输出是否成功。
if (cache.TryGetValue("mykey", out string value))
{
Console.WriteLine($"The value for mykey was: {value}");
// 因为指定了滑动过期时间为 10 秒,所以每 5 秒输出一条消息
for (int i = 0; i < 20; i++)
{
if(cache.TryGetValue("mykey", out string currentValue))
{
Console.WriteLine($"The value for mykey repeatedly is: {value}, " +
$"current value is : {currentValue}, " +
$"{@DateTime.Now.TimeOfDay.ToString()}");
}
else
{
Console.WriteLine($"The value for mykey expired at {DateTime.Now.TimeOfDay.ToString()}");
}
Thread.Sleep(5000);
}
}
else
{
Console.WriteLine("No value in cache.");
}
上述代码中,我们首先创建一个 MemoryCache 实例,然后通过 MemoryCacheEntryOptions 的 SetSlidingExpiration 方法设置缓存条目的滑动过期时间为 10 秒。
接着,我们使用 cache.Set 方法向 MemoryCache 中添加缓存数据。
在之后的代码中,我们使用了一个循环来反复读取这个缓存项的值,并输出结果。在缓存未失效的情况下,每 5 秒钟将输出一条消息,报告 MemoryCache 内存中的值。当数据过期后,尝试获取缓存值的语句将无法找到数据,并在输出消息后返回一个空值。