.NET ASP.NET 中的缓存Cache

一.为什么要引入缓存Cache?

我们知道,造成高并发的原因是大量读写的问题,一般的对于一个系统,读总是比写多,如我们总是逛淘宝,京东,天猫,唯品会等,但我们并不一定买东西(买东西,即下单,下单的操作,对应DB的Write操作),缓存主要解决读的问题(当然,在后期的文章中,我会讲到消息队列MQ,也是一种缓存机制,其不仅仅解决读的问题,还解决写的问题)。
很好,我们知道缓存主要解决读的问题,那么,我们读的东西很多,是不是缓存所有读的内容呢?答案是否定的。缓存主要解决那些高频访问,吃服务器资源,实时性要求比较低,不常更新的内容。

二.ASP.NET 缓存技术概述

1.缓存技术种类

在ASP.NET实际项目开发中,我们可以采取基本的三种缓存技术:页面缓存、局部页面和数据缓存
在这里插入图片描述

  • 整页缓存
    所谓整页缓存,指缓存整个页面,且设置刷新间隔时间,刷新间隔时间一般以秒为单位(缓存不能全部刷新,且刷新间隔不依赖外部事件);
  • 部分页面缓存
    所谓部分页面缓存,也叫局部页面缓存,指通过设定影响页面的参数,此时的缓存存储页面的多个版本,一般情况需要按照参数值为这些页面版本设置索引;
  • 运用程序缓存
    所谓运用程序缓存,也叫数据缓存,指将需要大量服务器资源的对象存储在内存中,在ASP.NET中,由Cache类来实现(Cache类的每个实例对应具体的每个运用程序,其生存期依赖于运用程序的生存期,当然,如果系统重启或者断电,则另当别论。)

2. 二级缓存技术

在ASP.NET一般的项目中,我们采用二级缓存就可以解决服务器缓存问题了,如下为二级缓存的轮廓图。
在这里插入图片描述

  • 何为一级缓存?
    一级缓存,指不借助于外部缓存的缓存,上图中的二级缓存去掉外部缓存部分即为一级缓存;
  • 组成:由Web服务器、数据库服务器和二级缓存系统构成;
  • 请求-处理流程:
    • 对于读数据,采用从内向外的顺序:内部缓存=》外部缓存=》数据库
    • 首次请求读数据:蓝色的箭头表示首次请求,从数据库服务器DB中取得数据,并将数据缓存在二级缓存系统中;
    • 非首次请求读数据:先从二级缓存内部缓存中取数据显示页面,如果没有数据,则去二级缓存外部缓存中取数据显示页面,若外部缓存中没有数据,则再去数据库服务器中取数据;
      在这里插入图片描述
    • 对于写数据,才有从外向内顺序:数据库=》外部缓存=》内部缓存(这样做的目的,主要是维护数据的一致性);
  • 构成二级缓存系统的外部缓存系统,一般我们可选择MongoDB,Redis,Mencached等;
  • 基于SOA+Redis的的一般系统架构(当然,本篇文章不谈架构,因此不会分析架构,但会在后续的文章中单独讲解架构)
    在这里插入图片描述
  • 如何保证数据的一致性?
    对于读数据,采用从内向外的顺序;对于写数据,采用从外向内的顺序;
  • 缓存的有效期?
    我们以Memcached做外部缓存为例,对于ASP.NET内部缓存,我们会担心内存不够用,而对于Memcached,则可以不用担心内存不够用的问题。
    采用二级缓存方案,Memcaches缓存与ASP.NET缓存都要进行严格的管理和控制,因为Memcached工作在外层,直接对数据库中的数据进行读取,且他的内存空间一般较大,故它的缓存数据有效期应该根据缓存数据在运用中的实际缓存有效期来设定,不会受到内部不足而被释放的影响,而ASP.NET缓存工作在内层,直接与运用程序中的数据进行交互,且ASP.NET框架对自身缓存的内存空间有所限制,缓存空间过大会影响整个运用的性能,为了在相同的内存空间下缓存更多的数据,ASP.NET缓存的有效期应该小于或等于Memcached缓存的有效期,有效期具体多长时间视内存空间和运用程序访问频率的高低而定,ASP.NET对同意缓存数据的有效期之和不能大于其在Memcached中的有效期,这样才能达到缓存数据的一致性,两个缓存的协同工作,可以对运用程序的访问速度带来很大的提升。

3.缓存涉及到的一些相关技术

缓存是一门技术,不可能花较少的篇幅即可讲明白,如下简要列举一些Cache相关的技术
在这里插入图片描述

  • Cahe维护
    维护网络上的,本地的Cache;
  • 路由策略
    具体的路由策略要根据Cache架构和设计来设定,大致讲解一下本地缓存路由策略
    在这里插入图片描述
  • 替换算法
    替换算法是指由于主存中的块比Cache中的块多,所以当要从主存中调一个块到Cache中时,会出现该块所映象到的一组(或一个)Cache块已全部被占用的情况。这时,需要被迫腾出其中的某一块,以接纳新调入的块。
    一些常见的替换算法:
    FIFO(First In First Out):遵循先入先出原则,若当前Cache被填满,则替换最早进入Cache的那个。
    LRU(Least Recently Used):最近最少被使用的被替换,也就是替换最后一次访问时间最久远的那个。
    LFU(Least Frequently Used):最不常使用的被替换,也就是过去某个时间窗口里引用次数最少的那个。
  • 预取技术
    预取技术是通过计算和访存的重叠,在Cache可能会发生失效之前发出预取请求以便在该数据真正被使用到时己提前将数据块取入Cache,从而避免Cache失效造成的处理器停顿。
    详述见:https://baike.baidu.com/item/%E9%A2%84%E5%8F%96%E6%8A%80%E6%9C%AF
  • Cache性能分析
    借助一些性能分析工具来分析,主要关注命中率/缓存对象大小之间关系
    在这里插入图片描述
  • 过期策略
    合理设置过期间隙,一般以秒为单位;
  • 数据一致性
    保证主从同步,读写数据的顺序等;
  • 缓存级别
    具体的级别,根据具体的业务需求来设定;
  • Cache技术
    磁盘缓存,存储器缓存,WWW服务器缓存等;
  • 数据缓存技术
    客户端数据缓存,分布式数据缓存,集中式数据缓存等;

三.Cache在ASP.NET MVC中的运用

1.整页缓存

  • ASP.NET MVC中有哪些整页缓存?
    整页缓存是一种比较简单且常用的缓存方式,缓存这个页面。在ASP.NET中,整页缓存一般包括控制器缓存,Action缓存,Web.config缓存等;
  • 哪些页面需要整页缓存?
    一般地,整页缓存页面具有“读取频繁,数据不常更新、编译时需要占用大量时间和资源”等特点;
  • ASP.NET MVC中整页缓存的语法格式
    在这里插入图片描述
  • 例子
    • 控制器缓存
      控制器缓存指把缓存作用于控制器。
      PageCacheController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace CacheDemo.Controllers
{
    [OutputCache(Duration = 70)]
    public class ControllerCacheController : Controller
    {
        // GET: Default
        public ActionResult ControllerCache()
        {
            
            ViewBag.CurrentTime = System.DateTime.Now;
            return View();
        }
    }
}

PageCache.cshtml

@{
    ViewBag.Title = "ControllerCache";
}

<h2>ControllerCache</h2>

<div>
    ViewBag的值:@ViewBag.CurrentTime
</div>

Result:
在这里插入图片描述

  • Action缓存
    Action缓存指把缓存作用于Action。控制方法缓存与控制器缓存原理差不多,只不过控制器缓存把缓存作用于控制器,控制器方法缓存把缓存作用于控制器方法。
  • Web.config缓存
    Web.config缓存,有点类似于我们将数据库连接字符串添加在配置文件一样,看看下面的代码,是否很熟悉呢?
<connectionStrings>
    <add name="SqlserverConstr" connectionString="Server=IP;db=DataBaseName;uid=UserName;pwd=Password" providerName="System.Data.SqlClient" />
  </connectionStrings>

Web.config将需要缓存的Controller或Action提取抽象到配置文件中,其实就相当于我们使用数据库连接字符串,使用时,调用即可。

<system.web>
    <caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name ="WebConfiCache" duration="70"/>
        </outputCacheProfiles>
      </outputCacheSettings>
    </caching>
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1" />
  </system.web>

我们将上面的控制器缓存参数用Web.config来配置

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace CacheDemo.Controllers
{
    //[OutputCache(Duration = 70)]
    [OutputCache(CacheProfile = "WebConfiCache")]
    public class ControllerCacheController : Controller
    {
        // GET: Default
        public ActionResult ControllerCache()
        {
            ViewBag.CurrentTime = System.DateTime.Now;
            return View();
        }
    }
}
  • 缓存依赖
    https://www.cnblogs.com/knowledgesea/p/3904929.html

2.部分页面缓存

部分页面缓存,也叫页面部分缓存,主要解决在页面缓存中需要经常实时更新的一部分内容。
页面部分缓存就是缓存页面的一部分,而不是缓存整个页面,它适用于页面内某些部分可能需要更新的数据的情况,在常用页面部分缓存的技术下经常采用先将整个页面缓存,然后再替换页面中不需要缓存的部分。(用AJAX局部刷新来理解)

3.运用程序缓存

运用程序缓存是用来存储与运用程序有关的对象,主要由Cache类来实现(命名空间System.Web.Caching),可以以编码的方式灵活地控制缓存的操作。
在这里插入图片描述
补充:
要从cache中获取一个缓存项,我们可以调用cache.get(key)方法,要将一个对象放入缓存,我们可以调用Add、insert方法,然而,Add、insert方法都有许多参数,有时我们或许只是想简单地放入缓存,一切接受默认值,那么还可以调用它的默认索引器

public object this[string key]
{
	get
	{
		return this.Get(key);
	}
	set
	{
		this.Insert(key.Value);
	}
	
}

可以看出,读缓存,其实是在调用Get方法,而写缓存是在调用insert方法的最简单的那个重载版本。
注:Add方法也可以将一个对象放入缓存,这个方法有7个参数,而insert也有一个签名类似的重载版本,它们有着类似的功能:将指定项添加到system.web.caching.cache对象,该对象具有依赖项,过期和优先级策略以及一个委托(可用于在从cache移除插入项时通知应用程序)。然而,它们有一点小的区别:当要加入的缓存项已经在cache中存在时,insert将会覆盖原有的缓存项目,而Add则不会修改原有缓存项。
转载地址:https://www.cnblogs.com/wangjiming/p/8271403.html
https://www.cnblogs.com/xgao/p/4174232.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值