本篇文章虽不谈架构,可是Cache又是架构中不可或缺的部分,所以,在讲解Cache的同时,将会说起到部分架构知识,关于架构部分,读者能够不用理解,或者直接跳过,html
你只需关心Cache便可,具体的架构,会在后续文章中与你们分享。web
一 为何要在ASP.NET 项目中引入缓存算法
1. 咱们先来考虑一个问题,一般,面临高并发问题时,咱们应该怎么处理?数据库
下图为常规的处理思路和方法缓存
2.为何引入Cache呢?服务器
咱们知道,形成高并发的根本缘由是大量读写的问题,通常地,对于一个系统,读老是比写多,如咱们老是逛淘宝,京东,天猫,惟品会等,但咱们并不必定买东西(买东西,即下单,下单的操做,对应DB的Write操做),缓存主要解决读的问题(固然,在后期的文章中,我会讲到消息队列MQ,也是一种缓存机制,其不只仅解决读的问题,还解决写的问题)。网络
很好,咱们知道缓存主要解决读的问题,那么,咱们读的东西不少,是否是缓存全部读的内容呢?答案是否认的。缓存主要解决那些高频访问,吃服务器资源,实时性要求比较低,不常更新的内容。架构
二 ASP.NET 缓存技术概述并发
(一)ASP.NET缓存技术种类app
在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),能够以编码的方式灵活地控制缓存的操做。
四 版权区