C#中缓存的使用

简介

缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此速率很快。由于CPU从内存中读取数据的速度比从磁盘读取快几个数量级,并且存在内存中,减小了数据库访问的压力, 所以缓存几乎每个项目都会用到。一般常用的有MemoryCache、Redis 今天就给大家带来MemoryCache的使用介绍!

类别

内存缓存过期时间有4种

•永不过期•绝对过期时间•相对现在的过期时间•滑动过期时间

当然也可以通过这三种过期时间衍生出 滑动窗口+绝对过期时间等等

官网地址

我们也可以查看官方文档 来详细了解MemoryCache 这里就不做过多解读了

•MemoryCache地址

使用

回到刚才的问题 我们来介绍怎么设置过期时间!

永不过期

就是在我程序发布后只要我们不去清理该缓存,该缓存会一直有效!

/// <summary>/// 永不过期时间/// </summary>
static void NeverExpire()
{_cache.Set("NeverExpire", "1");
}

绝对过期时间

用的是绝对时间点 可以理解成"截止日期"

static void AbsoluteExpiration(){DateTime time = new DateTime(2022, 04, 01, 23, 59, 59);_cache.Set("AbsoluteExpiration", "20220401235959", time);
}

相对现在的过期时间

相对现在的过期时间,就比如说我们设置缓存后的一分钟内有效,可以参考我们常见的 短信登录,后端随机生成一个验证码并存入redis,并且设置该key的过期时间,然后就是校验了,发送手机号码和验证码到后台, 从redis中取出对应的验证码就行校验,如果正确就把该验证码删掉,防止可以验证多次

static void ExpirationTimeRelativeToThePresent(){_cache.Set("AbsoluteExpiration", "123456", new TimeSpan(0, 0, 60));}

滑动过期时间

缓存在设定的时间内没有被使用,则失效,使用后缓存的过期时间重新被刷新

static void SlidingExpirationTime(){_cache.Set("SlidingExpirationTime", "3", new MemoryCacheEntryOptions(){SlidingExpiration = new TimeSpan(0, 0, 2),AbsoluteExpiration = DateTimeOffset.Now.AddMilliseconds(1000)});}

我们来看看官网的定义如图所示 !

d7f0d29a411ff59c80cfd8e4ee31d840.png

然后再来解释第二个参数MemoryCacheEntryOptions, 设置缓存项的绝对到期日期: 是当前缓存设置后的1000分钟。像我们经常玩的英雄联盟手游 ,我们一天不登陆,缓存的token失效, 就要重新登录获取token,我们每天都在玩触发了滑动过期时间,就不需要每次启动app时登录账号,但是 玩了一段时间后,发现我们还是需要重新登录我们的账号这个就是滑动过期时间中绝对过期时间!

获取缓存值

ConcurrentDictionary<object, CacheEntry> _entries:一个多线程安全的字典类型, 其实缓存的本质就是这个字典,将所有缓存都放入这个字典中,然后通过字典的key(字典的key其实和缓存实体CacheEntry的key值一样)获取CacheEntry实体(CacheEntry实体包含key和value, 也就是我们代码中设置的key和value)。

static void GetCache(){//方式一_cache.Get("NeverExpire").ToString();//方式二string value = "";if (!_cache.TryGetValue("NeverExpire", out value)){throw new Exception("不存在该缓存或者已过期");}
}

清除缓存值

static void GetCache(){string value = "";if (_cache.TryGetValue("NeverExpire", out value)){_cache.Remove("NeverExpire");}
}

可能大家发现了,我们在移除时根本就不需要value值,再去使用临时变量,是不是有点痛苦!

其实C#也考虑到了这个问题,那么c#从7.0开始支持弃元,弃元不只是书写和语义上的提升,它还可以减少内存分配。

将上面代码进行一个简化

static void GetCache(){if (_cache.TryGetValue("NeverExpire", out _)){_cache.Remove("NeverExpire");}
}

完整代码

class Program{public static IMemoryCache _cache = new MemoryCache(new MemoryCacheOptions());static void Main(string[] args){_cache.Get("NeverExpire").ToString();string value = "";if (!_cache.TryGetValue("NeverExpire", out value)){throw new Exception("不存在该缓存或者已过期");}if (_cache.TryGetValue("NeverExpire", out value)){_cache.Remove("NeverExpire");}if (_cache.TryGetValue("NeverExpire", out _)){_cache.Remove("NeverExpire");}}/// <summary>/// 永不过期时间/// </summary>static void NeverExpire(){_cache.Set("NeverExpire", "1");}/// <summary>/// 绝对过期时间/// </summary>static void AbsoluteExpiration(){DateTime time = new DateTime(2022, 04, 01, 23, 59, 59);_cache.Set("AbsoluteExpiration", "20220401235959", time);}/// <summary>/// 相对现在的过期时间/// </summary>/// static void ExpirationTimeRelativeToThePresent(){_cache.Set("AbsoluteExpiration", "123456", new TimeSpan(0, 0, 60));}/// <summary>/// 滑动过期时间/// </summary>static void SlidingExpirationTime(){_cache.Set("key3", "3", new MemoryCacheEntryOptions(){SlidingExpiration = new TimeSpan(0, 0, 2),AbsoluteExpiration = DateTimeOffset.Now.AddMilliseconds(1000)});}}

最后大家如果喜欢我的文章,还麻烦给个关注并点个赞, 希望net生态圈越来越好!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows Phone 8开发环境搭建介绍

1. 如果是Windows 8系统中安装VS2012&#xff0c;可以直接安装&#xff1a;   Windows Phone SDK 8.0 是一个功能齐全的开发环境&#xff0c;可用于构建 Windows Phone 8.0 和 Windows Phone 7.5 的应用和游戏。 Windows Phone SDK 将提供一个适用于 Windows Phone 的独立 Vi…

Tushare数据的绘图操作

1.在代码里调试学习实在费劲&#xff0c;可以把数据取到df里&#xff0c;在交互界面里慢慢调试 2.柱状图 绘制柱状图&#xff0c;默认情况下乱&#xff0c;数据太密了 改用曲线图

python远程执行shell 防止注入脚本_解决 window 上python远程执行shell paramiko 下令 Permission denied...

1. 若是程序是在 Linux远程执行 , 那么遇到某些下令是不需要 再输入密码的但若是 python 是在内陆 , 用 paramiko包 远程ssh登录执行下令 , 就会遇到需要输入密码2.解决办法 , 在windows上面 ssh-keygen -t rsa -C “abby192.168.1.100” , 公钥的作用域是远程 IP用户名 为’…

MT3608 高效率1.2MHz2A升压转换器和MT3608L 高效率1.2MHz 2.5A升压转换器 MT3608L和MT3608的区别

MT3608是一个恒定的频率&#xff0c;6引脚SOT23电流模式升压转换器的小&#xff0c;低功耗应用的目的。该MT3608开关在1.2MHz&#xff0c;并允许微小的&#xff0c;低成本的电容器和电感器使用2毫米或更小的高度内部软启动浪涌电流的结果&#xff0c;并延长电池寿命。 …

CityEngine 2012与ArcGIS 10.2破解心得

安装及破解步骤&#xff1a; 1.卸载机子上原有的ArcGIS的License以及Desktop。 2.安装及破解CityEngine。&#xff08;安装包及注册码下载见点击打开链接&#xff09; 3.安装ArcGIS Desktop即可&#xff0c;不需要安装Lisence。 4.如果第三步结束后ArcGIS打不开&#xff0c…

JsonRequestBehavior.AllowGet 方便浏览器调试

[HttpGet]public ActionResult getCoversationList(int CustomerId){// 获取用户相关的聊天数据&#xff0c;包括个人&#xff0c;群&#xff0c;系统(可以单独获取)return Json(new { result true, info "", msg "操作成功" }, JsonRequestBehavior.Al…

基于.NET6的开源工业物联网网关

什么是工业物联网网关工业物联网网关&#xff08;IIoTGateway&#xff09;是一种硬件设备或软件程序&#xff0c;作为本地设备(如PLC、扫码枪、机器人、数控机床、非标上位机等)与云端系统(如物联网平台、SCADA系统、MES系统等)之间的桥梁&#xff0c;在设备和云端之间流动的所…

CityEngine生成不等间距桥墩

在CityEngine中建立高架桥时自动生成的桥墩属于几乎等距的桥墩&#xff0c;对于不等距的桥墩该如何处理&#xff1f;另外&#xff0c;等距桥墩会有产生很多问题&#xff0c;比如&#xff1a;桥墩会压盖在下方路面上。 解决思路&#xff1a;获取桥墩点位数据&#xff0c;之后使用…

keepalived 报错 Popt libraries is required

2019独角兽企业重金招聘Python工程师标准>>> …… checking for SSL_CTX_new in -lssl... yes checking for poptGetContext in -lpopt... no configure: error: Popt libraries is required 解决办法 yum install popt-devel -y 转载于:https://my.oschina.net/col…

芒果TV会员,月卡最低9.9元,年卡最低128元!

全国首部湘商题材电视剧《一代洪商》&#xff0c;将于3月27日在央视八套&#xff08;电视剧频道&#xff09;播出&#xff0c;芒果TV将线上播出。该剧由王少华编剧&#xff0c;路奇担纲导演&#xff0c;孟凡耀担任总制片人&#xff0c;张丰毅、李立群、张睿、张含韵等人主演&am…

CityEngine如何生成隧道

在我们的生活中&#xff0c;大家经常乘坐汽车、动车等交通工具&#xff0c;会经过如隧道这样的路段&#xff0c;也许大家在经过隧道的时候会有一种疑惑&#xff0c;这隧道是如何修建的&#xff1f;对于我们GISer来讲&#xff0c;可能会考虑如何将其数字化&#xff0c;是以二维的…

Flask 应用的文件结构

2019独角兽企业重金招聘Python工程师标准>>> 作为微框架&#xff0c;即便只有一个文件也可以编写基于 Flask 的 Web 应用。然而对于许多现实世界中的应用&#xff0c;拥有数十个以上的视图&#xff08;view&#xff09;是非常正常的&#xff0c;这时候&#xff0c;F…

Xamarin效果第十二篇之控制祖传PLC

在前面使用DllImport去调用了公司祖传的PLC;坑也被坑了一下,但是总感觉还是基于祖传的Dll木有一点意思;毕竟就是一个数据的监控和开关量的控制;要是直接能用我的屌丝机控制一下就可以好好开(Z)心(B);毕竟前面咱也是玩过一点点Xamarin的,那就再次拾起来去玩耍一下吧;来看看最终咱…

CityEngine下如何更好的实现影像与地形叠加

问题&#xff1a;在利用CityEngine导入影像和地形时&#xff0c;会出现影像或地形不显示的问题。 分析&#xff1a;这主要是由影像、地形的尺寸大小和像素深度两个因素导致的。 解决&#xff1a; 1.调整尺寸 首先看一下影像和地形的大小。我们知道CityEngine并不是一个展示平台…

java script创建对象_javascript笔记:深入分析javascript里对象的创建

大家知道在java里面类可以具有静态属性和方法&#xff0c;无需实例化该类的对象&#xff0c;就可以访问这些属性和方法&#xff0c;但是javascript里面是不是只有通过对象初始化方式才会模拟出这样的特点了&#xff1f;其实不然&#xff0c;在编程语言里&#xff0c;类的方法和…

一分钟了解Android横竖屏 mdpi hdpi xhdpi xxhdpi xxxhdpi

DPI:每英寸像素数 简单的屏幕分辨率计算方法&#xff1a; DisplayMetrics metrics this.getResources().getDisplayMetrics(); float density metrics.density; int dpi metrics.densityDpi; int heightPixels metrics.heightPixels; int widthPixels metrics.widthPixels…

利用 .NET Core 中的数据保护组件实现限时 Token

前言在业务开发时&#xff0c;我们常常需要生成有过期时间的 Token 凭证。比如重置密码&#xff0c;即使被其他人获取到链接&#xff0c;超过指定时间也无法操作&#xff0c;以保证安全性&#xff1a;常用的实现方式&#xff0c;可以使用缓存或数据库存储 Token 的过期时间。今…

CityEngine Web Scene如何在IIS下部署

CityEngine2012新增了发布Web场景的功能&#xff0c;可以通过本地的Web Scene Viewer打开&#xff0c;也可以发布到ArcGIS Online云端进行共享。如下图&#xff1a; 注&#xff1a;3ws场景包制作方法&#xff1a;选中模型->File->Export->Export Models…->CityE…

WPF 使用DrawingVisual绘制高性能曲线图

一、前言项目中涉及到了心率监测&#xff0c;而且数据量达到了百万级别&#xff0c;通过WPF实现大数据曲线图时&#xff0c;尝试过最基础的Canvas来实现&#xff0c;但是性能堪忧&#xff0c;而且全部画出来也不实际。同时也尝试过找第三方的开源库&#xff0c;但是因为曲线图涉…

数据结构(Java)——迭代器和列表的实例

感谢Java软件结构与数据结构 John Lewis Joseph chase 著 金名译 0. 迭代器关键概念&#xff08;补充理解&#xff09; 【1】迭代器是一个对象&#xff0c;它提供了一种依次访问集合中每个元素的方式。 【2】经常把集合定义为Iterable的&#xff0c;说明需要时可以提供一个迭代…