勇哥注:
MemoryCache是.net framework或者.net core自带的缓存功能,功能弱鸡,只有基本的缓存功能。
但是对于应用微软技术栈的朋友来说,官方的东西是必须先了解的。
微软的技术栈,如果挨个拎出来对比,经常是被神仙群殴的体无完肤,但是只要它在项目上够用,还是会推荐用官方的。
因为那些第三方的、社区的东西,论持久性是不能跟官方的比的。
系列贴子列表:
.NET的缓存(二).net的 MemoryCache
http://www.skcircle.com/?id=2437
.NET的缓存(一)缓存、多级缓存的概念及用途的介绍
http://www.skcircle.com/?id=2436
MemoryCache核心是并发字典ConcurrentDictionary,由于省去序列化和网络通信,使得它具有超高性能,轻松达到千万次级别。
MemoryCache支持过期时间,默认容量10万个,未过期key超过该值后,每60秒根据LRU(Least Recently Used,最近最少使用)算法清理溢出部分(避免内存爆涨),常用于进程内千万级别以下数据缓存场景。
i9-10900k测试结果:
200,000,000,20线程
赋值 耗时 1,644ms 速度121,654,501 ops
读取 耗时 1,807ms 速度 110,680,686 ops
删除 耗时 2,936ms 速度 68,119,891 ops
累加 耗时 1,569ms 速度 127,469,725 ops
MemoryCache使用的是ICache接口,这个接口的主要实现还有Redis
MemoryCache在.net Core版本中相对于在.net framework中做了较大的增强。
本文介绍的是.net framework中的MemoryCache。
演示代码:
MemoryCache ic = new MemoryCache("c1"); TimeSpan timeout = TimeSpan.FromMinutes(5); CacheItem item=new CacheItem(""); CacheItemPolicy policy = new CacheItemPolicy(); //赋值 item.Key = "刘备"; item.Value = 42; policy.SlidingExpiration = timeout; var f2=ic.Add(item, policy); item.Key = "张飞"; item.Value = 41; policy.SlidingExpiration = timeout; ic.Add(item, policy); item.Key = "关云长"; item.Value = 38; policy.SlidingExpiration = timeout; ic.Add(item, policy); item.Key = "李小宝"; item.Value = 28; policy.SlidingExpiration = timeout; ic.Add(item, policy); //检索 var data1 =ic.Get("刘备"); Console.WriteLine($"{data1.ToString()}"); Console.WriteLine($"{ic.Count().ToString()}"); ic.Remove("李小宝"); Console.WriteLine($"{ic.Count().ToString()}"); //遍历 foreach(var m in ic) { Console.WriteLine($"key:{m.Key},value:{m.Value}"); } //Add和Set的区别,Add会检查是否有key,没有key才会添加 //Set,有key的就是更新,没key的就是添加 item.Key = "李小宝"; item.Value = 28; policy.SlidingExpiration = timeout; ic.Set(item, policy); bool f1=ic.Add(item, policy); if (!f1) Console.Write($"已存在key:{item.Key}\r\n"); //也可以判断是否有key f1=ic.Contains("李小宝"); if (f1) Console.Write($"已存在key:李小宝\r\n"); Console.Write($"可使用物理内存上限(百分比):{ic.PhysicalMemoryLimit}\r\n"); Console.Write($"可使用物理内存上限(字节):{ic.CacheMemoryLimit}\r\n");
附:社区贡献的缓存框架:
.NET开源强大、易于使用的缓存框架 - FusionCache
https://zhuanlan.zhihu.com/p/693168384

