1、使用Nuget安装引用MemoryCache(Microsoft.Extensions.Caching.Memory)
1)使用Nuget界面管理器
相关文档:VS(Visual Studio)中Nuget的使用
2)使用Package Manager命令安装
PM> Install-Package Microsoft.Extensions.Caching.Memory -Version 2.0.0
3)使用.NET CLI命令安装
> dotnet add package Microsoft.Extensions.Caching.Memory --version 2.0.0
2、使用示例代码
using System;
using System.Threading;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Primitives;
namespace MemoryCacheSample
{
public class Program
{
public static void Main()
{
//创建MemoryCache对象
IMemoryCache cache = new MemoryCache(new MemoryCacheOptions());
object result;
//获取存储缓存数据的Key
string key = "Key";
//存储的数据对象
object newObject = new object();
object state = new object();
// 创建 / 覆盖缓存
result = cache.Set(key, newObject);
result = cache.Set(key, new object());
// 获取缓存数据,没有返回null
result = cache.Get(key);
//out得到数据,返回是否获取成功
bool found = cache.TryGetValue(key, out result);
// 使用弱引用存储和获取
result = cache.SetWeak<object>(key, newObject);
result = cache.GetWeak<object>(key);
// 删除缓存
cache.Remove(key);
// 缓存条目配置:
// 保留在缓存中的时间越长越好
result = cache.Set(
key,
new object(),
new MemoryCacheEntryOptions().SetPriority(CacheItemPriority.NeverRemove));
// 如果在指定时间内没有访问,则自动删除
result = cache.Set(
key,
new object(),
new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromMinutes(5)));
// 在特定时间自动删除
result = cache.Set(
key,
new object(),
new MemoryCacheEntryOptions().SetAbsoluteExpiration(DateTimeOffset.UtcNow.AddDays(2)));
// 在特定时间自动删除,相对于现在的UTC
result = cache.Set(
key,
new object(),
new MemoryCacheEntryOptions().SetAbsoluteExpiration(relative: TimeSpan.FromMinutes(10)));
//如果在指定时间内没有访问,则自动删除
//在特定时间自动删除(如果使用时间长)
result = cache.Set(
key,
new object(),
new MemoryCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromMinutes(5))
.SetAbsoluteExpiration(DateTimeOffset.UtcNow.AddDays(2)));
// 收回时回调
var options = new MemoryCacheEntryOptions()
.RegisterPostEvictionCallback(
(echoKey, value, reason, substate) =>
{
Console.WriteLine(echoKey + ": '" + value + "' was evicted due to " + reason);
});
result = cache.Set(key, new object(), options);
// 令牌过期时删除
var cts = new CancellationTokenSource();
options = new MemoryCacheEntryOptions()
.AddExpirationToken(new CancellationChangeToken(cts.Token))
.RegisterPostEvictionCallback(
(echoKey, value, reason, substate) =>
{
Console.WriteLine(echoKey + ": '" + value + "' was evicted due to " + reason);
});
result = cache.Set(key, new object(), options);
// 触发token以查看执行的注册的回调
cts.Cancel();
// 如果从属条目过期,则使条目过期
using (var entry = cache.CreateEntry("key1"))
{
// 如果Key值为“key2”的条目过期,则该条目过期。
entry.Value = "value1";
cts = new CancellationTokenSource();
entry.RegisterPostEvictionCallback(
(echoKey, value, reason, substate) =>
{
Console.WriteLine(echoKey + ": '" + value + "' was evicted due to " + reason);
});
cache.Set("key2", "value2", new CancellationChangeToken(cts.Token));
}
// 触发token以查看执行的注册的回调
cts.Cancel();
}
}
}