AspnetCore 缓存篇

szlblog 2018-05-11 原文

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;
        }

View Code

 

创建缓存的方法有两个:

(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(30);
                cacheExpirationOptions.Priority = CacheItemPriority.Normal;
                cacheExpirationOptions.RegisterPostEvictionCallback(IDGCacheItemChangedHandler, this);
                //添加
                //类似 System.Web.HttpRuntime.Cache[key] 
                _cache.Set(key, value, cacheExpirationOptions);
            }
            //如果添加成功则验证是否存在返回True 或false
            return Exists(key);
        }
设置缓存的CacheItemPriority

View Code

 

添加缓存的时候利用MemoryCacheEntryOptions 来设置缓存:重点

具体实现:

 

利用缓存中Set方法最后一个参数  上方截图

MemoryCacheEntryOptions:绝对重要,他决定着怎么设置绝对过期时间和滑动过期时间,优先级等

 

缓存添加实现如下
 MemoryCacheEntryOptions cacheExpirationOptions = new MemoryCacheEntryOptions();
//绝对过期时间
                cacheExpirationOptions.AbsoluteExpiration = DateTime.Now.AddMinutes(30);
//缓存优先级
                cacheExpirationOptions.Priority = CacheItemPriority.Normal;
//添加缓存
   _cache.Set(key, value, cacheExpirationOptions);

View Code

 

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);
        }

View Code

 

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);
            }
        }

View Code

 

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;

View Code

 

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);
                

            }
        }

View Code

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);
            }
        }

View Code

缓存中整体的方法,不过有的没去实现

下面是所有方法的截图:

睡觉了一点半了,后面写的有点捉急抱歉,

 欢迎大家指出错误之处,转载注明出处,谢谢

                                                                                 

 

发表于 2018-05-11 01:36 乐途 阅读() 评论() 编辑 收藏

 

版权声明:本文为szlblog原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/szlblog/p/9022607.html

AspnetCore 缓存篇的更多相关文章

  1. 持续提升程序员幸福指数——使用abp vnext设计一款面向微服务的单体架构

    可能你会面临这样一种情况,在架构设计之前,你对业务不甚了解,需求给到的也模棱两可,这个时候你既无法明确到底是要 […]...

  2. .Net中异步任务的取消和监控

    .Net中异步任务的取消和监控 相关类型: CancellationTokenSource 主要用来创建或取消 […]...

  3. 【asp.net core 系列】5 布局页和静态资源

    0. 前言 在之前的4篇的内容里,我们较为详细的介绍了路由以及控制器还有视图之间的关系。也就是说,系统如何从用 […]...

  4. 学习ASP.NET Core Razor 编程系列二——添加一个实体

    在Razor页面应用程序中添加一个实体        在本篇文章中,学习添加用于管理数据库中的书籍的实体类。通 […]...

  5. .NET Core使用swagger进行API接口文档管理

    一、问题背景   随着技术的发展,现在的开发模式已经更多的转向了前后端分离的模式,在前后端开发的过程中,联系的 […]...

  6. Blazor WebAssembly 候选版迁移手记

    前言        之前我写过一篇关于 Blazor WebAssembly 的文章浏览器中的 .Net Co […]...

  7. Aspnet前后端分离项目手记(二)关于token认证

    在前后端分离的项目中,首先我们要解决的问题就是身份认证 以往的时候,我们使用cookie+session,或者 […]...

  8. 基于ASP.Net Core开发一套通用后台框架记录-(数据库设计(权限模块))

    写在前面 本系列博客是本人在学习的过程中搭建学习的记录,如果对你有所帮助那再好不过。如果您有发现错误,请告知我 […]...

随机推荐

  1. 原 spring-boot工程中,jpa下hibernate的ddl-auto的各种属性

    jpa:  hibernate:    ddl-auto: create ddl-auto:create […]...

  2. 利用周末时间通过整合自己的编程知识写了一个微信朋友圈集赞程序

    之前经常接收到微信好友发的消息让给朋友圈点赞,或是在朋友圈看到让帮忙给他们点赞的内容。看到这个的消息是不是觉得 […]...

  3. 整理之刷过的数据结构与算法题

    现在准备春招实习,又要疯狂刷题了,想起之前刷过的数据结构与算法题,放在github了,但是比较乱,没有给索引, […]...

  4. 【概率论与数理统计】小结1 – 概率论中的基本概念

    注:其实从中学就开始学习统计学了,最早的写”正”字唱票(相当于寻找众数),就是一种统计 […]...

  5. 面向对象设计大作业——火车售票系统

    Git地址 Gitee仓库 程序运行效果 用户注册登录: 按始发地、目的地查询购票: 按车次号查询购票: 查看 […]...

  6. macbookpro 以及 surface 的技术规格

    macbookpro 13.3 英寸 (对角线) LED 背光显示屏 (采用 IPS 技术);初始分辨率 25 […]...

  7. MATLAB中imfilter函数

    功能:对任意类型数组或多维图像进行滤波。 用法:B = imfilter(A,H)   B = imfilte […]...

  8. 封装数组之动态数组实现

      前言:在此之前,我们封装的数组属于静态数组,也即数组空间固定长度,对于固定长度的数组当元素超过容量时会报数 […]...

展开目录

目录导航