Asp.Net Core MemoryCache

mac2026-04-04  5

MemoryCache主要几种用法

Get:获取key=name的value

GetOrCreate,GetOrCreateAsync:如果key=name的value存在,则获取,不存在则设置一对新的

Set:设置key=name的value

TryGetValue:判断key=name是否存在,存在则返回true,不存在则返回false。同时将结果赋给一个值。

Get

//使用泛型,确定类型 string value1 = memoryCache.Get<string>("name"); //使用object对象 object value2 = memoryCache.Get("name");

没有该key则结果为null

GetOrCreate

string value1 = memoryCache.GetOrCreate("name",entry=> { entry.SetSlidingExpiration(TimeSpan.FromSeconds(5)); return "bin"; });

存在则获取该值

不存在则新设置一个值,并返回该值

Set

//memoryCache.Set<string>("name", "zhang"); //memoryCache.Set<string>("name", "zhang1", new MemoryCacheEntryOptions() //{ // AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(5) //}); //memoryCache.Set<string>("name", "zhang1", DateTimeOffset.Now.AddSeconds(5)); //memoryCache.Set<string>("name", "zhang1", TimeSpan.FromSeconds(5));

TryGetValue

var value = memoryCache.TryGetValue<string>("name", out def);

返回bool。存在则将value赋值给def,不存在则为空。


缓存设置选项

SlidingExpiration:滑动过期时间,如果一个值在滑动过期时间没有被访问,则置为空。如果期间被访问,则重置该时间。

AbsoluteExpiration:绝对过期时间,不论有没有被访问,到时间都会过期。

Priority:优先级,只在内存有压力时,被清理的优先级,数字越大,越不会被清理

SizeLimit 

设置缓存大小,这个大小是没有单位的,或者说这个单位是自定义的。

如果设置了这个Limit的值,则每次设置缓存的时候都必须设置Size大小,这个Size的增长幅度是自定义的,可以是一条,也可以是每条的大小。

当缓存的内容达到了这个大小,再添加值的话,则按照如下的顺序删除缓存

所有过期的项

按照优先级排序。删除优先级低的

最近最少使用的项

绝对过期的项

具有最早的可调过期项的项

Compact

删除某百分比的缓存

//memoryCache的类型是MemoryCache而不是IMemoryCache memoryCache.Compact(.33);

缓存自定义过期

var options = new MemoryCacheEntryOptions(); options.ExpirationTokens.Add(new MyChangeToken()); public class MyChangeToken : IChangeToken { public bool ActiveChangeCallbacks => false; public bool HasChanged => DateTime.UtcNow.Second % 20 == 0; public IDisposable RegisterChangeCallback(Action<object> callback, object state) { throw new NotImplementedException(); } }

只要实现了IChangeToken的类都可以,当HasChanged变为true时,缓存过期。


过期回调

options.PostEvictionCallbacks.Add(new PostEvictionCallbackRegistration() { EvictionCallback = (a,b,c,d) => { Console.WriteLine(a); Console.WriteLine(b); Console.WriteLine(c); Console.WriteLine(d); } });

级联

1.被引用的缓存过期,则调用的缓存也会过期

public IActionResult Set(string name,string value) { memoryCache.GetOrCreate("a", entry => { entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(20); return new A() { B= Fun(), Location = "1", Country = "zhang" }; }); return Ok(); } public B Fun() { return memoryCache.GetOrCreate("b",entry=> { entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(10); return new B() { Age = 1, Name = "zhang" }; }); }

2.父子

private int Fun() { return memoryCache.GetOrCreate("a", entry => { return memoryCache.GetOrCreate("b", ce => { ce.AddExpirationToken(new CancellationChangeToken(cts.Token)); return DateTime.Now.Second; }); }); }

 

最新回复(0)