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 缓存篇的更多相关文章

  1. jQuery2.x源码解析(缓存篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...

  2. 缓存篇(Cache)~大话开篇

    回到占占推荐博客索引 闲话杂淡 想写这篇文章很久了,但总是感觉内功还不太够,总觉得,要写这种编程领域里的心法(内功)的文章,需要有足够的实践,需要对具体领域非常了解,才能写出来.如今,感觉自己有写这种 ...

  3. 缓存篇(Cache)~第一回 使用static静态成员实现服务器端缓存(导航面包屑)

    返回目录 今天写缓存篇的第一篇文章,在写完目录后,得到了一些朋友的关注,这给我之后的写作带来了无穷的力量,在这里,感谢那几位伙伴,哈哈! 书归正传,今天我带来一个Static静态成员的缓存,其实它也不 ...

  4. 缓存篇(Cache)~第三回 HttpModule实现网页的文件级缓存

    返回目录 再写完缓存篇第一回之后,得到了很多朋友的好评和来信,所以,决定加快步伐,尽快把剩下的文章写完,本篇是第三回,主要介绍使用HttpModule实现的文件级缓存,在看本文之前,大家需要限度Htt ...

  5. 缓存篇~第六回 Microsoft.Practices.EnterpriseLibrary.Caching实现基于方法签名的数据集缓存

    返回目录 这一讲中主要是说EnterpriseLibrary企业级架构里的caching组件,它主要实现了项目缓存功能,它支持四种持久化方式,内存,文件,数据库和自定义,对于持久化不是今天讨论的重要, ...

  6. (转)高性能网站架构之缓存篇—Redis集群搭建

    看过 高性能网站架构之缓存篇--Redis安装配置和高性能网站架构之缓存篇--Redis使用配置端口转发 这两篇文章的,相信你已经对redis有一定的了解,并能够安装上,进行简单的使用了,但是在咱们的 ...

  7. 前端技巧:禁止浏览器static files缓存篇(转)

    前端技巧:禁止浏览器static files缓存篇 由于CSS/JS文件经常需要改动,前端调试时是不希望浏览器缓存这些文件的. 本文记录博主的经验. Meta法 目前在chrome调试还没有遇到问题, ...

  8. Spring Boot 揭秘与实战(二) 数据缓存篇 - Redis Cache

    文章目录 1. Redis Cache 集成 2. 源代码 本文,讲解 Spring Boot 如何集成 Redis Cache,实现缓存. 在阅读「Spring Boot 揭秘与实战(二) 数据缓存 ...

  9. Spring Boot 揭秘与实战(二) 数据缓存篇 - Guava Cache

    文章目录 1. Guava Cache 集成 2. 个性化配置 3. 源代码 本文,讲解 Spring Boot 如何集成 Guava Cache,实现缓存. 在阅读「Spring Boot 揭秘与实 ...

随机推荐

  1. MO_GLOBAL包中一些过程和函数的使用

    DECLARE V_CURRENT_ORG_ID NUMBER; V_ACCESS_MODE VARCHAR2(2); V_OU_COUNT NUMBER; V_ORG_ID NUMBER; V_MO ...

  2. Java将网络地址对应的图片转成本地的图片

     只知道浏览器使用的是HTTP协议,那么如何将网络资源使用JavaHTTP下载下来呢! 这只是一个非常简单的小示例,只是不想每次碰到关于此方面的内容忘了就无从下手! 示例创建HttpURLConn ...

  3. ECMAScript 6 入门简介

    ECMAScript 6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级 ...

  4. ABB机器人基础培训资料整理与总结

    之前对机械臂了解较少,这方面知识比较匮乏.只使用过PowercCube六自由度机械臂. 感谢ABB公司何老师的耐心指导. 学习资料汇总:(最重要的ABB Robot 官网就不列出了,这里以中文资料为主 ...

  5. 迭代器模式之看芒果台还是央视nie?

    "大风车吱呀吱悠悠的转,这里的风景啊真好看,天好看,地好看,还有一群快乐的小伙伴,大风车转呀转悠悠,快乐的伙伴手牵着手,牵着你的手,牵着我的手......"童年的美好时光因为有了& ...

  6. 使用MD5加密的登陆demo

    最近接手了之前的一个项目,在看里面登陆模块的时候,遇到了一堆问题.现在记录下来. 这个登陆模块的逻辑是这样的 1 首先在登陆之前,调用后台的UserLoginAction类的getRandomKey方 ...

  7. 《java入门第一季》之面向对象(匿名对象)

    /* 匿名对象:就是没有名字的对象. 匿名对象的应用场景: A:调用方法,仅仅只调用一次的时候. 注意:调用多次的时候,不适合. 匿名对象调用完毕就是垃圾.可以被垃圾回收器回收,释放了系统资源. B: ...

  8. iOS中UITableView分割线左侧顶齐

    iOS 7开始UITableView的分割线不在从左侧边界开始了,而是默认空出了一段距离. 如果想要使用默认的分割线而且还要从左侧边界开始的话,有几种解决方式: 1.在tableView的代理方法中设 ...

  9. 【资源分享】云计算 CRM 等网上搜集资料

    持续更新,作为抛砖引玉,如果您有更好.更新的资源,望大家分享.共同学习.详细信息尽在 华夏编程社区(HackProLabs)-------------------------------------- ...

  10. J2EE进阶(一)随堂笔记

    进公司搞研发,基本上用的都是J2EE框架.若想在公司混个不错的地位,首先技术上必须过关.由于需求所致,自己学习了J2EE一段时间,主要是Struts2,MyBatis(Hibernate的前身),远远 ...