Fork me on GitHub

浅谈缓存技术在ASP.NET中的运用

本篇文章虽不谈架构,但是Cache又是架构中不可或缺的部分,因此,在讲解Cache的同时,将会提及到部分架构知识,关于架构部分,读者可以不用理解,或者直接跳过,

你只需关心Cache即可,具体的架构,会在后续文章中与大家分享。

一   为什么要在ASP.NET 项目中引入缓存

1. 我们先来考虑一个问题,通常,面临高并发问题时,我们应该怎么处理?

下图为常规的处理思路和方法

 

2.为什么引入Cache呢?

        我们知道,造成高并发的根本原因是大量读写的问题,一般地,对于一个系统,读总是比写多,如我们总是逛淘宝,京东,天猫,唯品会等,但我们并不一定买东西(买东西,即下单,下单的操作,对应DB的Write操作),缓存主要解决读的问题(当然,在后期的文章中,我会讲到消息队列MQ,也是一种缓存机制,其不仅仅解决读的问题,还解决写的问题)。

        很好,我们知道缓存主要解决读的问题,那么,我们读的东西很多,是不是缓存所有读的内容呢?答案是否定的。缓存主要解决那些高频访问,吃服务器资源,实时性要求比较低,不常更新的内容。

二   ASP.NET 缓存技术概述

 (一)ASP.NET缓存技术种类

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

 1.整页缓存

  所谓整页缓存,指缓存整个页面,且设置刷新间隔时间,刷新间隔时间一般以秒为单位(缓存不能全部刷新,且刷新间隔不依赖外部事件);

 2.部分页面缓存

   所谓部分页面缓存,也叫局部页面缓存,指通过设定影响页面的参数,此时的缓存存储页面的多个版本,一般情况需要按照参数值为这些页面版本设置索引;

 3.运用程序缓存

   所谓运用程序缓存,也叫数据缓存,指将需要大量服务器资源的对象存储在内存中,在ASP.NET中,由Cache类来实现(Cache类的每个实例对应具体的每个运用程序,

其生存期依赖于运用程序的生存期,当然,如果系统重启或者断电,则另当别论。)

 (二)二级缓存技术

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

 

1.何为一级缓存?

   一级缓存,指不借助于外部缓存的缓存,上图中的二级缓存去掉外部缓存部分即为一级缓存;

 2.组成:由Web服务器、数据库服务器和二级缓存系统构成;

 3.请求-处理流程:对于读数据,采用从内向外的顺序:内部缓存=》外部缓存=》数据库

    (1)首次请求读数据:蓝色的箭头表示首次请求,从数据库服务器DB中取得数据,并将数据缓存在二级缓存系统中;

    (2)非首次请求读数据:先从二级缓存内部缓存中取数据显示页面,如果没有数据,则去二级缓存外部缓存中取数据显示页面,若外部缓存中没有数据,则再去数据库服务器中取数据;

 

 (4)对于写数据,才有从外向内顺序:数据库=》外部缓存=》内部缓存(这样做的目的,主要是维护数据的一致性);

4.构成二级缓存系统的外部缓存系统,一般我们可选择MongoDB,Redis,Mencached等;

5.基于SOA+Redis的的一般系统架构(当然,本篇文章不谈架构,因此不会分析架构,但会在后续的文章中单独讲解架构)

 

 6.如何保证数据的一致性?

  对于读数据,采用从内向外的顺序;对于写数据,采用从外向内的顺序;

 7.缓存的有效期?

    我们以Memcached做外部缓存为例,对于ASP.NET内部缓存,我们会担心内存不够用,而对于Memcached,则可以不用担心内存不够用的问题。

    采用二级缓存方案,Memcaches缓存与ASP.NET缓存都要进行严格的管理和控制,因为Memcached工作在外层,直接对数据库中的数据进行读取,

且他的内存空间一般较大,故它的缓存数据有效期应该根据缓存数据在运用中的实际缓存有效期来设定,不会受到内部不足而被释放的影响,而ASP.NET

缓存工作在内层,直接与运用程序中的数据进行交互,且ASP.NET框架对自身缓存的内存空间有所限制,缓存空间过大会影响整个运用的性能,为了在

相同的内存空间下缓存更多的数据,ASP.NET缓存的有效期应该小于或等于Memcached缓存的有效期,有效期具体多长时间视内存空间和运用程序访问

频率的高低而定,ASP.NET对同意缓存数据的有效期之和不能大于其在Memcached中的有效期,这样才能达到缓存数据的一致性,两个缓存的协同工作

,可以对运用程序的访问速度带啦很大的提升。

(三)缓存涉及到的一些相关技术

缓存是一门技术,不可能花较少的篇幅即可讲明白,如下简要列举一些Cache相关的技术

 

 1.Cahe维护

维护网络上的,本地的Cache;

2.路由策略

具体的路由策略要根据Cache架构和设计来设定,大致讲解一下本地缓存路由策略

 

3.替换算法

4.预取技术

5.Cache性能分析

借助一些性能分析工具来分析,主要关注命中率/缓存对象大小之间关系

 6.过期策略

合理设置过期间隙,一般以秒为单位;

7.数据一致性

保证主从同步,读写数据的顺序等;

8.缓存级别

具体的级别,根据具体的业务需求来设定;

9.Cache技术

磁盘缓存,存储器缓存,WWW服务器缓存等;

10.数据缓存技术

 客户端数据缓存,分布式数据缓存,集中式数据缓存等;

三   Cache在ASP.NET MVC中的运用

(一)整页缓存

1.ASP.NET MVC中有哪些整页缓存?

 整页缓存是一种比较简单且常用的缓存方式,缓存这个页面。在ASP.NET中,整页缓存一般包括控制器缓存,Action缓存,Web.config缓存等;

2.哪些页面需要整页缓存?

 一般地,整页缓存页面具有“读取频繁,数据不常更新、编译时需要占用大量时间和资源”等特点;

3.ASP.NET MVC中整页缓存的语法格式

 

4.例子

 (1)控制器缓存

控制器缓存指把缓存作用于控制器。

 PageCacheController.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace CacheDemo.Controllers
 8 {
 9     [OutputCache(Duration = 70)]
10     public class ControllerCacheController : Controller
11     {
12         // GET: Default
13         public ActionResult ControllerCache()
14         {
15             
16             ViewBag.CurrentTime = System.DateTime.Now;
17             return View();
18         }
19     }
20 }
21  

PageCache.cshtml

1 @{
2     ViewBag.Title = "ControllerCache";
3 }
4 
5 <h2>ControllerCache</h2>
6 
7 <div>
8     ViewBag的值:@ViewBag.CurrentTime
9 </div>

Result:

 

(2)Action缓存

Action缓存指把缓存作用于Action。控制方法缓存与控制器缓存原理差不多,只不过控制器缓存把缓存作用于控制器,控制器方法缓存把缓存作用于控制器方法。这里就不讲解了。

(3)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来配置

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace CacheDemo.Controllers
 8 {
 9     //[OutputCache(Duration = 70)]
10     [OutputCache(CacheProfile = "WebConfiCache")]
11     public class ControllerCacheController : Controller
12     {
13         // GET: Default
14         public ActionResult ControllerCache()
15         {
16             ViewBag.CurrentTime = System.DateTime.Now;
17             return View();
18         }
19     }
20 }
21  

分析:

其实相当简单,就当作数据库连接字符串来操作或者<appSetting>操作即可

 (3)缓存依赖

留给读者朋友们去研究,比较简单。

(二)部分页面缓存

 部分页面缓存,也叫页面部分缓存,主要解决在页面缓存中需要经常实时更新的一部分内容。

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

(三)运用程序缓存

运用程序缓存是用来存储与运用程序有关的对象,主要由Cache类来实现(命名空间System.Web.Caching),可以以编码的方式灵活地控制缓存的操作。

四   版权区

  • 感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。
  • 博主网址:http://www.cnblogs.com/wangjiming/。
  • 极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
  • 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:2098469527@qq.com。
  • 可以转载该博客,但必须著名博客来源。
posted @ 2018-01-12 23:08  Alan_beijing  阅读(9338)  评论(19编辑  收藏  举报