dotnet core MemoryCache笔记

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 内存中的值。当数据过期后,尝试获取缓存值的语句将无法找到数据,并在输出消息后返回一个空值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值