博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.net core系列之《在.net core中使用MemoryCache实现本地缓存》
阅读量:6058 次
发布时间:2019-06-20

本文共 5755 字,大约阅读时间需要 19 分钟。

说到内存缓存MemoryCache不由的让我想起.Net Framework中的MemoryCache,它位于 System.Runtime.Caching 程序集中。

接下来我们来看看.net core中的MemoryCache又有什么与众不同的地方吧。

一、基本实现

  1、打开NuGet包管理器搜索并安装 Microsoft.Extensions.Caching.Memory 包,或者从程序包管理控制台执行 Install-Package Microsoft.Extensions.Caching.Memory 命令

  2、接下来看实现代码

static void Main(string[] args)        {            MemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions());            memoryCache.Set("name","tom");            var value = memoryCache.Get("name");            Console.WriteLine(value);            Console.ReadKey();        }

  结果如下:

  

二、缓存容量控制:SizeLimit

  1、当你用SizeLimit属性设置了这个缓存大小之后,你就必须为你缓存中的每一项设置大小,否则则报错。当然,当你的大小达到你设置的SizeLimit时,你再设置缓存,它会自动清理一些缓存再缓存你设置的值

  2、代码如下:

static void Main(string[] args)        {            MemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions()            {                SizeLimit = 100            });            for (int i = 0; i < 1000; i++)            {                memoryCache.Set
(i.ToString(), i, new MemoryCacheEntryOptions() { Size = 1 }); } Console.WriteLine(memoryCache.Count); Console.ReadKey(); }

  结果如下:

  

  实际结果不是1000,而是100

  我们来看看它设置值的过程是什么样的:

  

  由于设置的大小为100,达到100时再设置缓存项就会自动清理掉一部分

三、缓期的过期问题

1、被动过期

  代码如下:

static void Main(string[] args)        {            MemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions());            memoryCache.Set("name", "jack", new MemoryCacheEntryOptions()            {                AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(5)//设置为5秒后过期            });            while (true)            {                System.Threading.Thread.Sleep(1000);                string value;                if (!memoryCache.TryGetValue("name", out value))                {                    value = "已过期";                }                Console.WriteLine(value);            }            //Console.ReadKey();        }

  结果如下:

  

2、主动过期

static void Main(string[] args)        {            MemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions());            CancellationTokenSource tokenSource = new CancellationTokenSource();            var cacheOptins = new MemoryCacheEntryOptions()            {                AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10)//设置为10秒后过期            };            cacheOptins.AddExpirationToken(new CancellationChangeToken(tokenSource.Token));            memoryCache.Set("name", "jack", cacheOptins);            tokenSource.CancelAfter(2000);//主动设置为2秒过期            while (true)            {                Thread.Sleep(1000);                string value;                if (!memoryCache.TryGetValue("name", out value))                {                    value = "已过期";                }                Console.WriteLine(value);            }            //Console.ReadKey();        }

  结果如下:

  

3、过期后回调:  

static void Main(string[] args)        {            MemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions());            CancellationTokenSource tokenSource = new CancellationTokenSource();            var cacheOptins = new MemoryCacheEntryOptions()            {                AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10)//设置为10秒后过期            };            cacheOptins.AddExpirationToken(new CancellationChangeToken(tokenSource.Token));            cacheOptins.RegisterPostEvictionCallback((key, value, reason, state) => {                Console.WriteLine(reason);            });            memoryCache.Set("name", "jack", cacheOptins);            tokenSource.CancelAfter(2000);//主动设置为2秒过期            while (true)            {                Thread.Sleep(1000);                string value;                if (!memoryCache.TryGetValue("name", out value))                {                    value = "已过期";                }                Console.WriteLine(value);            }            //Console.ReadKey();        }

  结果如下:

  

四、其它的一些设置

1、原子性操作

memoryCache.GetOrCreate("name", entry => "lucy");

2、优先级设置,这个设置是为了配合压缩缓存的

以下是系统定义的优先级的枚举

public enum CacheItemPriority    {        Low = 0,        Normal = 1,        High = 2,        NeverRemove = 3    }

接下来设定优先级

var cacheOptins = new MemoryCacheEntryOptions()            {                Priority= CacheItemPriority.Low,                AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10)//设置为10秒后过期            };

3、缓存压缩

static void Main(string[] args)        {            MemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions()            {                SizeLimit = 100            });            for (int i = 0; i < 100; i++)            {                CacheItemPriority priority = CacheItemPriority.Low;                if (25 < i && i < 50)                    priority = CacheItemPriority.Normal;                else if (50 < i && i < 75)                    priority = CacheItemPriority.High;                else                    priority = CacheItemPriority.NeverRemove;                memoryCache.Set(i.ToString(), i.ToString(), new MemoryCacheEntryOptions()                {                    Size = 1,                    Priority = priority,                    AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(10)//设置为10秒后过期                });            }            memoryCache.Compact(0.2);//压缩20%            Console.WriteLine(memoryCache.Count);            for (int i = 0; i < 100; i++)            {                Console.WriteLine(memoryCache.Get(i.ToString()));            }            Console.ReadKey();        }

结果如下:

压缩后的缓存项数:

被压缩的缓存项:

根据结果可知道,优先级为 CacheItemPriority.Normal 的数据被压缩掉了,由此可见,优先级为 CacheItemPriority.Low 的并没有参加压缩。

压缩的优先级顺序是 CacheItemPriority.Normal>CacheItemPriority.High>CacheItemPriority.NeverRemove 

转载于:https://www.cnblogs.com/hhzblogs/p/9720248.html

你可能感兴趣的文章
Smark —— 支持数学公式的 Markdown 编辑器
查看>>
Chrome 53 支持 Shadow DOM 等规范
查看>>
英国开发者编程语言和薪资调查:机器学习工资最高
查看>>
学会提问,玩转 GitHub 的问题单(issue)
查看>>
AlphaGo 的算法和技术分析
查看>>
《软件开发践行录——ThoughtWorks中国区文集》一一2.6 结语
查看>>
需要密切关注的六大人工智能/机器学习领域
查看>>
《MacTalk•人生元编程》一一1.1 Linux的文件系统王国
查看>>
《网赚的秘密——草根网民淘金实战》一一1.3 网赚内容的重要性
查看>>
初创团队如何招募靠谱的技术团队
查看>>
在 Android 使用 C# 开发 iBeacons 信标应用
查看>>
feilong-taglib 1.10.3,JSP 常用自定义标签集
查看>>
《Cacti实战》——3.3 数据可视化流程
查看>>
六步优化你的 Ubuntu 14.04
查看>>
CN-Erlounge-IV大会流水账(上)(update)
查看>>
linux安装中文字体
查看>>
《写给程序员的数据挖掘实践指南》——1.1欢迎来到21世纪
查看>>
《高性能响应式Web开发实战》一1.3 写作思路
查看>>
《Spring 5 官方文档》5. 验证、数据绑定和类型转换(三)
查看>>
《ASP.NET MVC 4 实战》----第 2 章 第一个MVC应用程序 2.1 设置开发环境
查看>>