本篇文章虽不谈架构,但是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. 树莓派学习笔记——USB wifi配置指南

    0 前言     树莓派既能够使用有线网络又能够无线网络,假设使用有线网络不方便的话能够借助USB wifi无线网卡让树莓派也插上无线"翅膀". 可是和使用有线网络即插即用的方式不 ...

  2. mock.js的真实数据模拟

    哈哈,怎么说,这应该是我的第一个随笔了,毕竟前端之路上一直在学习并且各位大神们的经验,虽然也有不少的坑,但是总是收获比较多,所以我也想把一些收获记录下来,有需要的可以参考参考. 网上看了不少大神很多例 ...

  3. ASP.NET Core 指定环境发布(hosting environment)

    ASP.NET Core 应用程序发布命令: dotnet publish [<PROJECT>] [-f|--framework] [-r|--runtime] [-o|--output ...

  4. ASP.NET Core 使用 Redis 客户端

    Mac OS 安装 Redis(用于连 Redis 服务器,方便查看数据):https://redis.io/topics/quickstart wget http://download.redis. ...

  5. 机器学习笔记2 – sklearn之iris数据集

    前言 本篇我会使用scikit-learn这个开源机器学习库来对iris数据集进行分类练习. 我将分别使用两种不同的scikit-learn内置算法--Decision Tree(决策树)和kNN(邻 ...

  6. 获取AJAX加载的内容

    1.有些网页内容使用AJAX加载,AJAX一般返回的是JSON,直接对AJAX地址进行post或get,就返回JSON数据了. 2.用抓包工具分析https://movie.douban.com/j/ ...

  7. 面试题(php部分)

    1.用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分) [答案] $a = date("Y-m-d H:i:s", strtotime("-1 ...

  8. Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/context/embedded/ServletRegistrationBean

    异常信息 2017-09-02 18:06:37.223 [main] ERROR o.s.boot.SpringApplication - Application startup failed ja ...

  9. 【java设计模式】【创建模式Creational Pattern】建造模式Builder Pattern

    package com.tn.pattern; public class Client { public static void main(String[] args) { Director dire ...

  10. 截取ip 不加引号

    ip a |grep  /26 |cut -b10- | cut -d / -f 1