Asp.Net Core MemoryCache

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值