少有人走的路

勇哥的工业自动化技术网站

.NET的缓存(二).net的 MemoryCache

勇哥注:

MemoryCache是.net framework或者.net core自带的缓存功能,功能弱鸡,只有基本的缓存功能。

但是对于应用微软技术栈的朋友来说,官方的东西是必须先了解的。

微软的技术栈,如果挨个拎出来对比,经常是被神仙群殴的体无完肤,但是只要它在项目上够用,还是会推荐用官方的。

因为那些第三方的、社区的东西,论持久性是不能跟官方的比的。


系列贴子列表:

.NET的缓存(二).net的 MemoryCache

https://www.skcircle.com/?id=2437


.NET的缓存(一)缓存、多级缓存的概念及用途的介绍

https://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


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接

Powered By Z-BlogPHP 1.7.3

Copyright www.skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864