浅谈缓存技术在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。
  • 可以转载该博客,但必须著名博客来源。

转载于:https://www.cnblogs.com/wangjiming/p/8271403.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git快速入门+复习笔记

对于学习编程的同志来说&#xff0c;学习Git是必不可少的一项技术&#xff0c;如果你是第一次观看我的文章&#xff0c;欢迎关注我的频道&#xff0c;我会分享更多有趣的知识。 文章目录1 目标2 概述2.1 开发中的实际场景2.2 版本控制器的方式2.3 工作流程图3 Git安装和常用命令…

Android浏览器速度测试,Android平台浏览器网页加载速度对比评测

参与测试的浏览器手机上网已经渐渐成为人们的一种习惯&#xff0c;无论在等公交时、乘地铁时、吃饭等餐时&#xff0c;很多朋友都习惯掏出手机简单浏览一下微博、人人、新闻网站等页面。移动网络的确为我们带来了莫大的便利&#xff0c;但网速和稳定性却是移动网络的硬伤。针对…

操作系统随笔(一)

你好朋友&#xff0c;当你点进来这份读书笔记时&#xff0c;我相信你不是无意中点进来就是对这一部分饶有兴趣&#xff0c;可惜的是&#xff0c;我也只是个普通的大学生&#xff0c;有时候对知识的见解获取没有屏幕前的你那么有天赋&#xff0c;所以在阅读完这篇文章的同时点个…

codeforces 483B Friends and Presents 解题报告

题目链接&#xff1a;http://codeforces.com/problemset/problem/483/B 题目意思&#xff1a;有两个 friends&#xff0c;需要将 cnt1 个不能整除 x 的数分给第一个friend&#xff0c;cnt2 个不能整除 y 的数分给第二个friend。x 和 y 都是素数来的。要求求出最小的 v&#xff…

并行计算随笔(一)

如果觉得本篇文章对你有所启发&#xff0c;请给我点个赞好吗&#xff0c;这对我很重要&#xff0c;谢谢 文章目录1 并行计算基础1.1 什么是并行计算1.1.1 对计算速度的需求1.1.2 并行计算1.1.3 并行计算的基本条件1.1.4 平行计算和分布式计算1.2 为什么需要并行计算1.3 并行计算…

命令行的形式运行php

转自&#xff1a;http://www.cnblogs.com/myjavawork/articles/1869205.html 注意&#xff1a;在安装php时需要将php 的安装目录加到环境变量 PATH 中 (右击我的电脑->属性->高级->环境变量, 如果存在 PATH 则在原来的 PATH 中加入你的PHP安装目录, 如果不存在则新建一…

idea android 模块,IntelliJ IDEA 12 - 新的Android应用程序模块向导失败,“无法找到模块的资源目录”...

我面临的问题是一个非常简单的问题... 我无法使用IntelliJ IDEA 12来帮助我创建一个Android应用程序模块(项目)。IntelliJ IDEA 12 - 新的Android应用程序模块向导失败&#xff0c;“无法找到模块的资源目录”成功安装的IntelliJ IDEA 12和使IDE和二者的SDK(Java和Android设备)…

JQuery常用知识点汇总

2019独角兽企业重金招聘Python工程师标准>>> 0、JQuery的基本属性标识&#xff1a; $(".xxx")&#xff1a;标签的class属性&#xff1b; $("#xxx")&#xff1a;标签的id属性&#xff1b; $("xxx")&#xff1a; 标签名&#…

数据库杂谈(三)——关系代数

3 形式化关系查询语言 摘要&#xff1a;关系代数是一种抽象的查询语言&#xff0c;用对关系的运算来表达查询&#xff0c;作为研究关系数据语言的数学工具。在本文中&#xff0c;我们不仅谈论关系代数的知识点&#xff0c;而且还配备了对应的练习题。 文章目录3 形式化关系查询…

android native.js,Android Native与JS通信互调

写在最前&#xff1a;看Android最新技术总结&#xff0c;关注公众号&#xff1a;最近因为App与H5交互逻辑太乱&#xff0c;所以抽空梳理了下&#xff1b;对目前App与H5的各种交互通信做个总结&#xff0c;自取适合自己的交互方式。一、H5调用原生的native方法1、拦截shouldOver…

SharePoint2013 Excel导出好的代码

C#Excel操作类ExcelHelper.cs 来源&#xff1a;http://www.hellocsharp.com/article/67.aspx C#源码世界 发布于&#xff1a; 2014-09-12使用本类之前必须在本机安装了office excel组件或直接下载Microsoft.Office.Interop.Excel.dll文件引用到项目目录下&#xff1a; 然后复制…

基于PMOS的电源防反接电路

如下图所示&#xff0c;是来自TI的参考设计TIDA-00982中的一个电路&#xff0c;功能主要是防止输入反接&#xff0c;R6和C6形成吸收回路&#xff0c;可以对上电过冲有一定的抑制作用。电源正常接入时&#xff0c;PMOS导通&#xff0c;给负载供电&#xff0c;由于VDS的存在&…

计算机组成原理随笔(一)

1 计算机体系结构 计算机革命发展得非常快速&#xff0c;以至于使用老式计算机的很多电影现在看起来十分有年代感&#xff0c;有的电影甚至无法预料后来的计算机是什么样的。 计算机各个组成部分的技术发展非常不均衡&#xff0c;各部分性能差异非常大。在计算机的发展前期&a…

Mongo读书笔记1 -- GridFS

一个Mongo文档最大4M. GridFS不依赖于MongoDB, 其他符合规范的驱动都可以访问它。 GridFS包含两部分&#xff1a;一部分存储文件名和其他metadata; 另一部分存储实际的文件&#xff0c;通常分成一个个大小为256k的小块。 这两个部分通常被命名为files和chunks,在fs命名空间下&a…

简单搭建一个SSM项目(一)

简单搭建一个用户管理的SSM项目框架&#xff0c;虽然也能用servletjdbc搭建更简单的&#xff0c;不过个人感觉工作中更多用的ssm框架项目&#xff0c;这里就简单用ssm来搭建需要的项目吧。 准备工具&#xff1a;eclipse、jdk1.7、Mysql、maven、tomcat。&#xff08;请先确定计…

android wp主题,WP桌面:win10系统的最佳替代安卓应用

WP桌面是信壹网络继刷机大师、ROOT大师和安卓清理大师后重点开发的一款仿windows phone风格的手机桌面应用&#xff0c;从2012年推出至今已获得海内外千万粉丝的好评。这个基于Android开发的手机桌面&#xff0c;这不仅仅体现了WP桌面良好的用户体验&#xff0c;同时也从侧面反…

数据结构杂谈(三)

本文的所有代码均由C编写 如果你已经看完这篇杂谈,你可以前往上一篇杂谈→数据结构杂谈&#xff08;二&#xff09;_尘鱼好美的小屋-CSDN博客 3 单链表 文章目录3 单链表[toc]3.1 单链表的定义3.1.1 引入2.1.2 单链表和顺序表的优劣2.1.3 单链表的代码定义3.2 单链表的初始化3.…

Mac Book Pro不能识别移动硬盘

2019独角兽企业重金招聘Python工程师标准>>> 今天把一台Mac Book Pro重装了一下系统&#xff0c;然后想把移动硬盘上的资料考入电脑&#xff0c;发现插上移动硬盘电脑没有反映。马上搜索解决办法&#xff0c;众说纷纭。因为没重装之前是好的&#xff0c;所以判断为软…

数据库杂谈(四)——关系演算和E-R数据模型

文章目录3 形式化关系查询语言3.2 关系演算和E-R数据模型3.2.1 概述3.2.2 元组关系演算3.2.2.1 概述3.2.2.2 形式化定义3.2.2.3 表达式的安全性3.2.3 域关系演算3.2.4 关于关系演算的习题3.2.5 对传统数据模型的评价3.2.6 E-R数据模型3.2.6.1 基本概念3.2.6.2 E-R图3.2.7 题型总…

小程序获取微信用户绑定的手机号

小程序API内提供getPhoneNumber借口来获取用户已经绑定到微信的手机号,但需要用户主动触发才能发起获取手机号接口&#xff0c;所以该功能不由 API 来调用; 基本流程如下: 使用方法 需要将 <button> 组件 open-type 的值设置为 getPhoneNumber&#xff0c;当用户点击并同…