本篇文章虽不谈架构,但是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

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace CacheDemo.Controllers
{
[OutputCache(Duration = )]
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:

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

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

分析:

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

(3)缓存依赖

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

(二)部分页面缓存

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

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

(三)运用程序缓存

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

四   版权区

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

【ASP.NET 系列】浅谈缓存技术在ASP.NET中的运用的更多相关文章

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

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

  2. 浅谈Hybrid技术的设计与实现第三弹——落地篇

    前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...

  3. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

  4. 浅谈Hybrid技术的设计与实现

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 随着移动浪潮的兴起,各种APP层出不穷,极速的业务扩展提升了团队对开发 ...

  5. 浅谈PHP技术应用

    序号:1210-41 黑龙江省高等教育自学考试 本科毕业论文 题    目    浅谈PHP技术 学员姓名    夏滟 专    业    计算机及应用 准考证号    010311192585 指导 ...

  6. (转)浅谈Hybrid技术的设计与实现

    转载地址:https://www.cnblogs.com/yexiaochai/p/4921635.html 前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hyb ...

  7. 浅谈Hybrid技术的设计与实现【转】

    https://www.cnblogs.com/yexiaochai/p/4921635.html 前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术 ...

  8. 浅谈.NET技术公司的实习生培养

    浅谈.NET技术公司的实习生培养 背景 近几年.NET开发者市场的越发不景气,一毕业就选择.NET技术的开发者更是少之又少.一方面是公司效益的日益提高,一方面却是招聘优秀人才的速度总是赶不上公司发展的 ...

  9. 浅谈数据库技术,磁盘冗余阵列,IP分配,ECC内存,ADO,DAO,JDBC

    整理-----数据库技术,磁盘冗余阵列,IP分配, ECC内存,ADO, DAO,JDBC 1.MySQL MySQL是最受欢迎的开源SQL数据库管理系统,它由 MySQL AB开发.发布和支持.My ...

随机推荐

  1. 用KMP算法实现strStr()

    strStr()函数的用途是在一个字符串S中寻找某个字串P第一次出现的位置.并返回其下标,找不到时返回-1.最简单的办法就是找出S全部的子串和P进行比較,然而这种方法比較低效.假设我们从S的下标0和P ...

  2. ML01 机器学习后利用混淆矩阵Confusion matrix 进行结果分析

      目标: 快速理解什么是混淆矩阵, 混淆矩阵是用来干嘛的. 首先理解什么是confusion matrix 看定义,在机器学习领域,混淆矩阵(confusion matrix),又称为可能性表格或是 ...

  3. mybatis 之 占位符#{} 和 ${}

    #{}占位符用来设置参数,参数的类型可以有3种,基本类型,自定义类型,map基本类型作为参数,参数与占位符中的名称无关. <select id="findById" para ...

  4. CenOS 6.5下 mysql自动备份

      1.mysql备份命令是mysqldump,自动执行可以用cron,但是文件名需要带有时间标志,shell处理起来很麻烦,我就选择了python来解决 2.文件名用time模块来解决,执行系统命令 ...

  5. rsync 指定端口拷贝

    rsync -aP -e 'ssh -p 2288' ssh-audit.dat 172.18.18.31:/opt/freesvr/audit/sshgw-audit/sbin

  6. Eclipse多行同时进行编辑,可编辑或修改相同内容

    使用Shift+Alt+A可以进入Eclipse多行编辑的功能,选中的一部分区域从光标开始处同时进行修改或者插入功能. 再次按下Shift+Alt+A可已退出该编辑模式.

  7. TensorFlow文档翻译-01-TensorFlow入门

    版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/junyang/p/7429771.html TensorFlow入门 英文原文地址:https://w ...

  8. 什么是WAL?

    在写完上一篇<Pull or Push>之后,原本计划这一片写<存储层设计>,但是临时改变主意了,想先写一篇介绍一下消息中间件最最基础也是最核心的部分:write-ahead ...

  9. c#的关键字

    abstract as base bool break byte case catch char checked decimal default delegate continue double do ...

  10. Java 多线程笔记

    资料来源于网络,仅供参考学习.   1.A Java program ends when all its threads finish (more specifically, when all its ...