AspnetCore 缓存篇
AspnetCore 缓存篇
一、缓存的作用
怎样理解缓存:
其实所有的程序,架构,优化,线程...等技术手段,最终的目的都是如何使产品快速的响应用户的操作,提高用户的体验性,目标都是为了系统的使用者,缓存的存在也是同样的道理,缓存常用于存放不经常更改的数据信息,比如,用户的基础数据、Token等一些长被使用并且不常更改的.
举例说明
咱们就拿用户的登录操作来说,有一个系统是这样设计的,(1)用户(输入用户名:密码)登录》》》(2)首先程序做的是在缓存中查询数据,判断是否有缓存存在,缓存是否过期,如果缓存过期了》》》(3)进库查询用户是否具有登录的权限》》》最后是功能页面。 一张简单的图加深一下印象
在上图中我们可以看到如果缓存存在的话,我们大可不必进库去查询数据了,省去了查询的动作、开关库、判断的操作。加入这些动作可以省去1秒钟的时间,这就已经在提高用户的体验性了。
缓存的作用不只是这一个方面,建议大家多去找找资料,每个人学出来的东西都不一样。
比如缓存的状态、生存期、缓存的类别 等
二、ASPNet Core的内置缓存
AspNetCore支持多种缓存,首先说一下AspNetCore 的内置缓存 IMemoryCache,
IMemoryCache把数据存储在Web服务器的内置缓存中,也就是Web服务器缓存,和 System.Web.HttpRuntime 缓存作用上差别不大 ,但是在Core中去掉了System.Web.HttpRuntime 的命名引用被移除,引入命名空间Microsoft.Extensions.Caching.Memory
使用NuGet管理工具添加如下:
针对Core缓存我们做出如下几个操作:
1.首先创建一个缓存:
操作步骤引入命名空间,Microsoft.Extensions.Caching.Memory
在我们的帮助类中用构造器注入的方式创建IMemoryCache 的对象
代码如下
- private IMemoryCache _cache;
- //构造器注入
- public CoreMemoryCache(IMemoryCache memoryCache)
- {
- _cache = memoryCache;
- }
创建缓存的方法有两个:
(1) Set(); 创建一个缓存项,可以设置缓存项的绝对和滑动过期时间,优先级等。
(2) GetOrCreate(); 方法的含义和命名一致,获取或创建,如果缓存存在则获取缓存项,如果不存在则创建缓存项。
代码如下
(1)Set();
- public bool Add(string key, object value)
- {
- if (string.IsNullOrEmpty(key))
- {
- #region ArgumentNullException说明
- /*
- * 如果不想返回异常信息的话也可以返回 自己定义的
- * 当参数为空时放生的异常
- * 和 ArgumentException 作用相同
- */
- #endregion
- // throw new ArgumentNullException(key);
- }
- else
- {
- MemoryCacheEntryOptions cacheExpirationOptions = new MemoryCacheEntryOptions();
- cacheExpirationOptions.AbsoluteExpiration = DateTime.Now.AddMinutes();
- cacheExpirationOptions.Priority = CacheItemPriority.Normal;
- cacheExpirationOptions.RegisterPostEvictionCallback(IDGCacheItemChangedHandler, this);
- //添加
- //类似 System.Web.HttpRuntime.Cache[key]
- _cache.Set(key, value, cacheExpirationOptions);
- }
- //如果添加成功则验证是否存在返回True 或false
- return Exists(key);
- }
- 设置缓存的CacheItemPriority
添加缓存的时候利用MemoryCacheEntryOptions 来设置缓存:重点
具体实现:
利用缓存中Set方法最后一个参数 上方截图
MemoryCacheEntryOptions:绝对重要,他决定着怎么设置绝对过期时间和滑动过期时间,优先级等
- 缓存添加实现如下
- MemoryCacheEntryOptions cacheExpirationOptions = new MemoryCacheEntryOptions();
- //绝对过期时间
- cacheExpirationOptions.AbsoluteExpiration = DateTime.Now.AddMinutes();
- //缓存优先级
- cacheExpirationOptions.Priority = CacheItemPriority.Normal;
- //添加缓存
- _cache.Set(key, value, cacheExpirationOptions);
MemoryCacheEntryOptions的Priority属性。 Priority属性指定应将哪些对象(基于已设置的优先级)从缓存中删除,作为每当Web服务器内存空间不足时回收内存的运行时策略的一部分。要设置优先级,我们使用CacheItemPriority枚举。这可以具有以下可能的值之一:低,正常,高和NeverRemove。 ASP.Net Core中的内存缓存提供程序将在内存压力下移除缓存条目,如果将缓存优先级设置为CacheItemPriority.NeverRemove。这个时候我们可以注册一个回调,该回调将在从缓存中移除条目时执行
MemoryCacheEntryOptions中的 RegisterPostEvictionCallback 这个可以用来记录日志什么的
举例代码如下:
- cacheExpirationOptions.RegisterPostEvictionCallback(AddCallback,this);
- //public enum EvictionReason
- //{
- // None = 0,
- // //
- // // 摘要:
- // // Manually
- // Removed = 1,
- // //
- // // 摘要:
- // // Overwritten
- // Replaced = 2,
- // //
- // // 摘要:
- // // Timed out
- // Expired = 3,
- // //
- // // 摘要:
- // // Event
- // TokenExpired = 4,
- // //
- // // 摘要:
- // // Overflow
- // Capacity = 5
- //}
- public void AddCallback(object key, object value, EvictionReason reason, object state)
- {
- _cache.Set("CallbackMsg", reason);
- }
(2)GetOrCreate();
代码如下:
- 代码如下:
- /// <summary>
- /// 存在创建不存在获取
- /// </summary>
- /// <param name="key"></param>
- /// <param name="value"></param>
- /// <returns></returns>
- public bool AddOrCreate(string key, object value)
- {
- if (string.IsNullOrEmpty(key))
- { }
- else
- {
- // public static TItem GetOrCreate<TItem>(this IMemoryCache cache, object key, Func<ICacheEntry, TItem> factory);
- _cache.GetOrCreate(key, ENTRY => { return value; });
- }
- //如果添加成功则验证是否存在
- return Exists(key);
- }
2. 删除缓存
(1) Remove();
这个见名就知道了
代码如下:
- /// <summary>
- /// 删除缓存
- /// </summary>
- /// <param name="key"></param>
- /// <returns></returns>
- public bool Remove(string key)
- {
- if (string.IsNullOrEmpty(key))
- {
- return false;
- }
- else
- {
- //删除
- _cache.Remove(key);
- //如果删除成功则验证是否存在返回bool
- return !Exists(key);
- }
- }
3. 修改缓存
(1)修改缓存并没有具体的方法,咱们代码走的是,先删除后添加的方法
代码如下:
- /// <summary>
- /// 修改缓存
- /// </summary>
- /// <param name="key"></param>
- /// <param name="value"></param>
- /// <returns></returns>
- /// 修改时 MemoryCache 没有提供相对相应的方法,先删除后添加
- public bool Modify(string key, object value)
- {
- bool ReturnBool = false;
- if (string.IsNullOrEmpty(key))
- { }
- else
- {
- if (Exists(key))
- {
- //删除
- if (!Remove(key))
- {
- ReturnBool = Add(key, value);
- }
- }
- }
- return ReturnBool;
4.获取缓存项
(1)Get();
代码如下:
- /// <summary>
- /// 获取缓存
- /// </summary>
- /// <param name="key"></param>
- /// <returns></returns>
- public object Get(string key)
- {
- if (string.IsNullOrEmpty(key))
- {
- return false;
- }
- else
- {
- #region 另一种判断方式
- /*
- _cache.TryGetValue(key, out ReturnValue)检索缓存输出Bool;
- 用这个也可以直接把 out 输出就行
- */
- #endregion
- return _cache.Get(key);
- }
- }
5.验证缓存是否存在
代码如下:利用TryGetValue();
- /// <summary>
- /// 验证缓存是否存在
- /// </summary>
- /// <param name="key"></param>
- /// <returns></returns>
- public bool Exists(string key)
- {
- object ReturnValue;
- if (string.IsNullOrEmpty(key))
- {
- return false;
- }
- else
- {
- return _cache.TryGetValue(key, out ReturnValue);
- }
- }
缓存中整体的方法,不过有的没去实现
下面是所有方法的截图:
睡觉了一点半了,后面写的有点捉急抱歉,
欢迎大家指出错误之处,转载注明出处,谢谢
AspnetCore 缓存篇的更多相关文章
- jQuery2.x源码解析(缓存篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...
- 缓存篇(Cache)~大话开篇
回到占占推荐博客索引 闲话杂淡 想写这篇文章很久了,但总是感觉内功还不太够,总觉得,要写这种编程领域里的心法(内功)的文章,需要有足够的实践,需要对具体领域非常了解,才能写出来.如今,感觉自己有写这种 ...
- 缓存篇(Cache)~第一回 使用static静态成员实现服务器端缓存(导航面包屑)
返回目录 今天写缓存篇的第一篇文章,在写完目录后,得到了一些朋友的关注,这给我之后的写作带来了无穷的力量,在这里,感谢那几位伙伴,哈哈! 书归正传,今天我带来一个Static静态成员的缓存,其实它也不 ...
- 缓存篇(Cache)~第三回 HttpModule实现网页的文件级缓存
返回目录 再写完缓存篇第一回之后,得到了很多朋友的好评和来信,所以,决定加快步伐,尽快把剩下的文章写完,本篇是第三回,主要介绍使用HttpModule实现的文件级缓存,在看本文之前,大家需要限度Htt ...
- 缓存篇~第六回 Microsoft.Practices.EnterpriseLibrary.Caching实现基于方法签名的数据集缓存
返回目录 这一讲中主要是说EnterpriseLibrary企业级架构里的caching组件,它主要实现了项目缓存功能,它支持四种持久化方式,内存,文件,数据库和自定义,对于持久化不是今天讨论的重要, ...
- (转)高性能网站架构之缓存篇—Redis集群搭建
看过 高性能网站架构之缓存篇--Redis安装配置和高性能网站架构之缓存篇--Redis使用配置端口转发 这两篇文章的,相信你已经对redis有一定的了解,并能够安装上,进行简单的使用了,但是在咱们的 ...
- 前端技巧:禁止浏览器static files缓存篇(转)
前端技巧:禁止浏览器static files缓存篇 由于CSS/JS文件经常需要改动,前端调试时是不希望浏览器缓存这些文件的. 本文记录博主的经验. Meta法 目前在chrome调试还没有遇到问题, ...
- Spring Boot 揭秘与实战(二) 数据缓存篇 - Redis Cache
文章目录 1. Redis Cache 集成 2. 源代码 本文,讲解 Spring Boot 如何集成 Redis Cache,实现缓存. 在阅读「Spring Boot 揭秘与实战(二) 数据缓存 ...
- Spring Boot 揭秘与实战(二) 数据缓存篇 - Guava Cache
文章目录 1. Guava Cache 集成 2. 个性化配置 3. 源代码 本文,讲解 Spring Boot 如何集成 Guava Cache,实现缓存. 在阅读「Spring Boot 揭秘与实 ...
随机推荐
- 重构前VS重构后效果对比
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42554641 学习重构已经一个多月了,虽然不能让代码特别的 ...
- SpringMVC提供两种校验机制
本文不讲如何使用SpringMVC提供的两种校验机制,只是简单的说明一下其中的差别而已: 1.创建一个Bean,在Bean的属性中添加校验信息,通过配置LocalValidatorFactoryBea ...
- MPLSVPN 命令集
载请标明出处:http://blog.csdn.net/sk719887916,作者:skay 读懂下面配置命令需要有一定的TCP/IP,路由协议基础,现在直接上关键VPN命令. router ...
- unity实现玻璃效果
一.使用Cubemap,做一个假反射 shader代码如下: Shader "Custom/glassShader" { Properties { _MainColor(" ...
- (二十四)监听键盘的通知和键盘弹出隐藏的View移动
让控制器监听键盘的通知,注意谁监听,谁的dealloc方法中就要remove,如果非ARC还要调用父类的dealloc方法. //监听键盘的操作: [[NSNotificationCenter def ...
- python 2.4 的字符串转时间(日期减法取间隔时间)
python 2.4中datetime有strftime方法,而无strptime方法.不能对字符串进行格式转换.比如不能将"2013-10-22"转化为日期. 2.4中字符串转日 ...
- Windows CE Notification API的使用方法
1 引言 以Windows CE 为操作系统的掌上电脑(如PocketPC或HPC),除具备PC的功能外,还具备很强的自身控制能力.Windows CE API超越微软其他操作系统的 API ...
- 如何用代码禁用SpriteBuilder中创建的关节
这个目标是临时的禁用距离关节(distance joint). 不幸的是,你只可以无效化(通过删除的方式)一个关节. 所以,你必须通过代码创建一个新的距离关节实例并且赋予它之前删除关节(在Sprite ...
- 【一天一道LeetCode】#17. Letter Combinations of a Phone Number
一天一道LeetCode (一)题目 Given a digit string, return all possible letter combinations that the number cou ...
- 如何配置android的adb环境变量
如果打开DOS窗口,输入adb显示既不是内部命令也不是外部命令,则说明没有配置adb环境变量.方法如下: 第一步: 打开环境变量配置窗口.右击计算机,属性-高级系统设置-环境变量. 第二部: 添加an ...