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,一经查实,立即删除!

相关文章

artDialog ( v 6.0.2 ) content 参数引入页面 html 内容

/*! artDialog v6.0.2 | https://github.com/aui/artDialog */ 将页面某一隐藏的 div 的 html 内容传到 artdialog 的弹窗中&#xff0c;并且该 div 不会被删除&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8…

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…

java怎么做系统_Java系统监控怎么做

Sigar是Hyperic-hq产品的基础包,是Hyperic HQ主要的数据收集组件。它用来从许多平台收集系统和处理信息. 这些平台包括&#xff1a;Linux, Windows, Solaris, AIX, HP-UX, FreeBSD and Mac OSX. Sigar有C&#xff0c;C#&#xff0c;Java和Perl API&#xff0c;java版的API为sig…

动态规划之两个字符串的最大子序列

1、问题 求两个字符串的最大子序列 1)、子序列和子字符串有区别,子字符串(子串)必须连续,列如 s1 = "ABCDAB" s2= "BBCDAAB" s1和s2最大子序列有"BCDA","BCDB", "CDAB","ABAB","BCAB"...,子序…

Tushare数据的绘图操作

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

centos打架django + mysql环境

---恢复内容开始--- 1、安装python centos下&#xff0c;python已经自动安装过了 2、安装django 推荐使用pip安装 wget https://bootstrap.pypa.io/get-pip.py //下载get-pip.py 文件 python get-pip.py //执行一下&#xff0c;提示安装pip成功 pip install django //可以加…

你真的了解Lambda表达式吗?

简介Lambda 是一种可用于创建委托或表达式目录树类型的匿名函数。通过使用 lambda 表达式&#xff0c;可以写入可作为参数传递或作为函数调用值返回的本地函数&#xff01;场景比如有这样一个场景&#xff0c;在给出的List集合中找出数字大于等于18的数字&#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…

函数学习-abs()

下面开始&#xff0c;今天的函数是abs()先看官方英文文档解释abs(x)Return the absolute value of a number. The argument may be a plain or long integer or a floating point number. If the argument is a complex number, its magnitude is returned.详解&#xff1a;返回…

动态规划之编辑距离

1、问题 例如两个字符串 FAMILY 和 FRAME ,有两种 对齐方式: 1)、 F_A MIL Y FRAME 2)、 _FAMILY FRAME 第 1 种对齐需要付出的代价: 4 ,插入 R ,将 I 替换为 E ,删除 L 、 Y 。 第 2 种对齐需要付出的代价: 5 ,插入 F,将 F 替换为 R ,将 I 替换为 E ,删除 L 、 Y 。…

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;在设备和云端之间流动的所…

php之简单使用数据库

1.数据库连接 1.1用windows命令行链接数据库服务器 几个DOS命令 在DOS环境下命令后面没有分号&#xff0c;在MySQL环境下&#xff0c;命令后面有分号 进入盘符&#xff1a; 语法&#xff1a;盘符&#xff1a; 进入盘符下的某个文件夹 语法&#xff1a;cd 路径 上级目录&#xf…

CityEngine生成不等间距桥墩

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

linux之vim操作快速跳到下一个空格和上一个空格命令

1、问题 vim里面如何再文本里面快速跳到下一个空格和上一个空格 2、操作 w是在文本里面快速跳到下一个空格 b是在文本里面快速跳到上一个空格

有哪些小游戏的java代码_求一个Java小游戏代码(鼠标点击类小游戏)最好代码里面不要有中文...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼}else{black_count0;}if(chess[i][j]2){white_count;if(white_count5){JOptionPane.showMessageDialog(this,"白棋胜利");Clear_chess();return;}}else{white_count0;}}}for(int i0;i<11;i)//竖向到五个子赢棋{for(in…

SmartFoxServer资料

http://blog.sina.com.cn/s/blog_6bc2090c0100pgkx.html http://www.cnblogs.com/winson-w/p/3555106.html http://www.smartfoxserver.com/ http://asfox.blogbus.com/c1617676 http://www.cnblogs.com/sevenyuan/archive/2009/12/04/1616853.html

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…