说到内存缓存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 =
});
for (int i = ; i < 1000; i++)
{
memoryCache.Set<int>(i.ToString(), i, new MemoryCacheEntryOptions() {
Size =
});
}
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秒后过期
});
while (true)
{
System.Threading.Thread.Sleep();
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秒后过期
};
cacheOptins.AddExpirationToken(new CancellationChangeToken(tokenSource.Token)); memoryCache.Set("name", "jack", cacheOptins); tokenSource.CancelAfter();//主动设置为2秒过期
while (true)
{
Thread.Sleep();
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秒后过期
};
cacheOptins.AddExpirationToken(new CancellationChangeToken(tokenSource.Token)); cacheOptins.RegisterPostEvictionCallback((key, value, reason, state) => {
Console.WriteLine(reason);
}); memoryCache.Set("name", "jack", cacheOptins); tokenSource.CancelAfter();//主动设置为2秒过期
while (true)
{
Thread.Sleep();
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 = ,
Normal = ,
High = ,
NeverRemove =
}

接下来设定优先级

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

3、缓存压缩

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

结果如下:

压缩后的缓存项数:

被压缩的缓存项:

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

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

.net core系列之《在.net core中使用MemoryCache实现本地缓存》的更多相关文章

  1. .net core系列之《.net core内置IOC容器ServiceCollection》

    一.IOC介绍 IOC:全名(Inversion of Control)-控制反转 IOC意味着我们将对象的创建控制权交给了外部容器,我们不管它是如何创建的,我们只需要知道,当我们想要某个实例时,我们 ...

  2. Asp.Net Core 内置IOC容器的理解

    Asp.Net Core 内置IOC容器的理解 01.使用IOC容器的好处 对接口和实现类由原来的零散式管理,到现在的集中式管理. 对类和接口之间的关系,有多种注入模式(构造函数注入.属性注入等). ...

  3. net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解

    asp.net core 内置DI容器的一点小理解   DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...

  4. NET Core 3.0 AutoFac替换内置DI的新姿势

    原文:NET Core 3.0 AutoFac替换内置DI的新姿势 .NET Core 3.0 和 以往版本不同,替换AutoFac服务的方式有了一定的变化,在尝试着升级项目的时候出现了一些问题. 原 ...

  5. 浏览器扩展系列————给MSTHML添加内置脚本对象【包括自定义事件】

    原文:浏览器扩展系列----给MSTHML添加内置脚本对象[包括自定义事件] 使用场合: 在程序中使用WebBrowser或相关的控件如:axWebBrowser等.打开本地的html文件时,可以在h ...

  6. 简单讲解Asp.Net Core自带IOC容器ServiceCollection

    一.  理解ServiceCollection之前先要熟悉几个概念:DIP.IOC.DI.Ioc容器: 二.  接下来先简单说一下几个概念问题: 1.DIP(依赖倒置原则):六大设计原则里面一种设计原 ...

  7. ASP.NET Core 2.1 : 十二.内置日志、使用Nlog将日志输出到文件

    应用离不开日志,虽然现在使用VS有强大的调试功能,开发过程中不复杂的情况懒得输出日志了(想起print和echo的有木有),但在一些复杂的过程中以及应用日常运行中的日志还是非常有用. ASP.NET ...

  8. asp.net core 内置DI容器的一点小理解

    DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IOC). 具体体现为Micorosoft.Extensio ...

  9. 学习笔记:GLSL Core Tutorial – Vertex Shader(内置变量说明)

    1.每个Vertex Shader都有用户定义的输入属性,例如:位置,法线向量和纹理坐标等.Vertex Shaders也接收一致变量(uniform variables). uniform vari ...

  10. .net core 2.0学习记录(三):内置IOC与DI的使用

    本篇的话介绍下IOC和ID的含义以及如何使用.Net Core中的DI. 一.我是这么理解IOC和DI的: IOC:没有用IOC之前是直接new实例来赋值,使用IOC之后是通过在运行的时候根据配置来实 ...

随机推荐

  1. springboot项目:登录 登录aop拦截 使用Redis与cookie 进行设置获取清除操作

    登录.登出: 第一步:在pom文件中引入依赖 <dependency> <groupId>org.springframework.boot</groupId> &l ...

  2. wap webapp app区别

    “手机WAP版网站”.“手机触屏版网站”.“手机APP应用软件”: wap webapp app区别 电脑版:台式机或者笔记本访问,兼容各个浏览器: Wap版:用于传统智能手机,屏幕小,适合使用手机键 ...

  3. Android多媒体之照相机

    1.调用系统的照相机 public void click(View view) { // 激活系统的照相机拍照 Intent intent = new Intent("android.med ...

  4. Cocos文档案例游戏设计的梳理与分析

    导语:这是一篇新手教程,适用于已看完Cocos官方文档,但还对游戏设计.运行流程不熟悉的新人.这篇教程是对文档[快速上手]里那款名叫"摘星星"的坑爹小游戏(文档原话)流程的梳理,以 ...

  5. 虹软人脸识别在 linux中so文件加载不到的问题

    其实是可以加载到的,不过是so文件放的位置不一对,最简单的方式是放在 /usr/lib64 目录下,也可自己设置. so文件加载不到会报这个错误:    .lang.UnsatisfiedLinkEr ...

  6. 入门系列之使用fail2ban防御SSH服务器的暴力破解攻击

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由SQL GM发表于云+社区专栏 介绍 对于SSH服务的常见的攻击就是暴力破解攻击--远程攻击者通过不同的密码来无限次地进行登录尝试.当 ...

  7. R语言格式化数字和字符串format函数

    数字和字符串可以使用 format()函数的格式化为特定样式. 语法 format()函数的基本语法是: format(x, digits, nsmall,scientific,width,justi ...

  8. VFL子视图居中

    今天做UI用VFL适配在View上添加一个图片想让指定宽高的图片居中显示,我用下面的代码想着能实现可是出来的效果并没有居中. UIImageView *headView=[[UIImageView a ...

  9. DateTime compare

    DateTime t1 = new DateTime(100); DateTime t2 = new DateTime(20); if (DateTime.Compare(t1, t2) > 0 ...

  10. linux运维人员成长

    原文地址:https://blog.csdn.net/kwame211/article/details/78059331 初级篇 linux运维人员常用工具拓扑详见: 1rsync工具 很多地方经常会 ...