【ASP.NET 系列】浅谈缓存技术在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/。
  • 极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
  • 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:[email protected]。
  • 可以转载该博客,但必须著名博客来源。

原文地址:https://www.cnblogs.com/wangjiming/p/8271403.html

时间: 2024-08-26 03:29:45

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

【开源】浅谈Hybrid技术的设计与实现第二弹

前言 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) PS:据说加个开源在前面阅读量高点,于是就试试咯...... 上文说了很多关于Hybrid的概要设计,可以算得上大而全,有说明有demo有代码,对于想接触Hybrid的朋友来说应该有一定帮助,但是对于进阶的朋友可能就不太满足了,他们会想了解其中的每一个细节,甚至是一些Native的实现,小钗这里继续抛砖引玉,希望接下来的内容对各位有一定帮助. 进入今天的内容之前我们首先谈谈两个相关技术Ionic与React Nativ

浅谈PHP技术应用

序号:1210-41 黑龙江省高等教育自学考试 本科毕业论文 题    目    浅谈PHP技术 学员姓名    夏滟 专    业    计算机及应用 准考证号    010311192585 指导教师    马大龙 学    院    地理科学学院 哈 尔 滨 师 范 大 学 2012年10月1日 目    录 摘  要………………………………………………………………………………1 一.PHP技术简介…………………………………………………………………1 二.PHP开发语言的特点…………………

浅谈Hybrid技术的设计与实现

浅谈Hybrid技术的设计与实现 前言 随着移动浪潮的兴起,各种APP层出不穷,极速的业务扩展提升了团队对开发效率的要求,这个时候使用IOS&Andriod开发一个APP似乎成本有点过高了,而H5的低成本.高效率.跨平台等特性马上被利用起来形成了一种新的开发模式:Hybrid APP. 作为一种混合开发的模式,Hybrid APP底层依赖于Native提供的容器(UIWebview),上层使用Html&Css&JS做业务开发,底层透明化.上层多多样化,这种场景非常有利于前端介入,非

浏览器兼容性系列--浅谈window.attachEvent

以前写 JavaScript 脚本时,事件都是采用object.event = handler;的方式初始化.这种方式对于 Internet Explorer.Mozilla/Firefox 和 Opera 来说很通用.但是有一个问题就是,这种方式只能一个事件对应一个事件处理过程.如果希望一个事件可以依次执行多个处理过程就不好用了.但是 Internet Explorer 从 5.0 开始提供了一个 attachEvent 方法,使用这个方法,就可以给一个事件指派多个处理过程了.attachEv

浅谈信息加密技术和算法

1单向散列加密 单向散列加密是指通过对不同输入长度的信息进行散列计算,得到固定长度的输出,这个散列计算过程是单向的,不可逆的.常用的单向散列算法有MD5,SHA等. 比如网站中,用户密码,一般可以进行MD5加密后保存,用户登录时,对用户输出的密码进行加密后和数据库密文进行比较,如果一致,则验证成功. 为了加强计算的安全性,可以对数据加上密钥,增加破解的难度. 推荐使用 apache common的 commons-codec的 jar包 比如(commons-codec-1.8.jar)    

【ZOJ】3785 What day is that day? ——浅谈KMP应用之ACM竞赛中的暴力打表找规律

首先声明一下,这里的规律指的是循环,即找到最小循环周期.这么一说大家心里肯定有数了吧,“不就是next数组性质的应用嘛”. 先来看一道题 ZOJ 3785 What day is that day? Time Limit: 2 Seconds      Memory Limit: 65536 KB It's Saturday today, what day is it after 11 + 22 + 33 + ... + NN days? Input There are multiple tes

浅谈DevExpress&lt;三&gt;:在GridView中加载动态图片

今天的演示效果如下:在GridView中的下拉框中选中一种颜色,则后面的加载相应的图片,如下图: 1. 2. 3. 下面说下实现方法:首先在项目中拉一个GirdControl,在里面创建4列:ID,Name,Color,Image,并将Color和Image分别创建repositoryItemComboBox和repositoryItemPictureEdit控件,如下图: 将一个图片文件夹放到程序的启动目录中: 文件夹中包含如下图片: 接下来进行创建数据模板,先创建一个Datetable,添加

浅谈缓存写法(一):缓存的雪崩和穿透

基本写法 为了方便演示,这里使用Runtime.Cache做缓存容器,并定义个简单操作类.如下: <pre class="brush:csharp;gutter:true;" style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word;"> public class CacheHelper { public static object Get(str

浅谈CDN技术的性能与优势

从淘宝架构中的CDN入手分析 使用CDN和反向代理提高网站性能.由于淘宝的服务器不能分布在国内的每个地方,所以不同地区的用户访问需要通过互联路由器经过不同长度的路径来访问服务器,返回路径也一样,所以数据传输时间比较长.对于这种情况,常常使用CDN解决,CDN将数据内容缓存到运营商的机房,用户访问时先从最近的运营商获取数据,这样大大减少了网络访问的路径. 在这里简单介绍一下CDN的原理.CDN的全称Content Delivery Network,即内容分发网络.其基本思路是尽可能避开互联网上有可