一:我们为什么要使用缓存?

先来理解一下asp.net缓存技术的基本原理:把访问频繁的数据以及需要花大量的时间来加载的数据缓存在内存中,那么用户在下次请求同样的数据时,直接将内存中的数据返回给用户,从而大大的提高了应用程序的性能。

二:缓存的分类(整页缓存,页面部分缓存,应用程序缓存)

那么什么时候我们要用到整页缓存,什么时候用到部分页面缓存,什么时候我们要用到应用程序缓存呢?

>>整页缓存的情况:

a)不需要平凡更新数据的页面

b)占用大量时间和资源的页面

>>页面部分缓存:

顾名思义,页面部分缓存,则只需要缓存页面中的部分页面,常用方法是“缓存后替换”,就是下缓存整个页面,然后替换页面中不需要缓存的地方。这里要用到一个Substitution控件实现,稍后详细讲解它的应用。

>>应用程序缓存:

用来存储与应用程序相关的对象,主要由Cache类来实现,它给我们提供了一种机制,使我们可以通过编码的方式来灵活控制缓存操作。

三:如何使用"整页缓存"?

  首先我们需要在页面顶部加上这样一个指令:

  <%@ OutputCache Duation="5" VaryByParam="id,name" VaryByControl="none" Location="any" VaryByCustom="browser" %>

  以下详细介绍一下各个属性的用途:

  • Duration:必要属性,就是这个页面过多久后缓存不在起到作用,单位是s
  • VaryByParam:以分号分隔的字符串变量/none/* ,none表示不随任何参数彼变化缓存,*表示为任何一个有效的参数缓存一个单独的页面。 注意:如果没有BaryByControl属性,该属性是必要的。
  • VaryByControl:以分号分隔的字符串变量,代表用户控件中声明的服务器控件的ID,注意:如果没有VaryByParam,该属性是必须的。
  • VaryByCustom:自定义输出缓存的要求,它需要在global.asax中定义自定义变动,一般默认值为browser,根据了浏览器决定缓存要求。
  • Location:指定输出缓存项的位置,OutputCacheLocation枚举,默认值为any。

例如:现在我们有一个图书详情页面,这里就拿当当网的图书详情页面来举例,当当网当你选择一本书后,进入到图书详情页,详情页肯定会包含:该图书的点击量,价格,目录信息,作者,出版社等等的一些介绍。

那么我们要缓存这个页面首现需要在页面顶部添加这样一个指令:

1)首现无条件缓存:<%@ OutputCache Duration="120" VaryByParam="none" %>

这个表示什么意思呢?就是这个页面缓存时间为120秒,假如你进到这个详情页,然后卖家在后台修改了图书的出版社,那么你现在无论怎么刷新,你看到的价格始终都是刚进页面时的出版社信息。必须等到120s后,点击刷新才可以看到卖家修改后的出版社信息。

2)根据条件缓存:<%@ OutputCache Duration="120" VaryByParam="bookId,bookName" %>

这个就是说以bookId或者bookName作为参数传递的页面都将被缓存120s,例如:http://web/BookDetails.aspx?bookId ,页面会被缓存120s。

3)根据VaryByControl属性:<%@ OutputCache Duration="120" VaryByParam="none" VaryByControl="ddlCategories" %>

  当需要缓存的数据随页面上的某个控件值的改变而改变,根据asp.net控件的命名规则,大家都知道ddlCategories控件就是一个图书的分类控件了(DropDawnList)。

现在假如有一个图书分类的页面,那么假如卖家修改了某个分类下的某一本图书的信息,当用户在页面中查看到的还是修改之前的信息,只有在更换ddCategories控件的项后,在更新才会显示修改后的图书信息。

四:如何使用"页面部分缓存"?

  <%@ OutputCache Duration="120" VaryByParam="none"  %>

  什么情况我们要使用到部分页面缓存呢,还是拿图书详情页来举例子:现在要统计图书时实的点击量。

   首先放入一个:<asp:Substitution ID="Sub1" runat="server" MethodName="GetClickCount" />  控件。

   这个控件就是用来显示点击量的,我们可以看到MethodName属性调用了一个GetClickCount()方法。

   static string GetClickCount(HttpContext contxt)

  {

    //根据图书ID查询本图书的点击量

    int clickCount = manage.GetClick(bookId);

    return clickCount.ToString();

  }

  假如现在点击量是1000次,那么你刷新后,点击量可能变成了1000+次了,因为此时此刻该图书可能还有其他的用户在点击访问。由此证明该图书的点击量并没有被缓存起来。

  这里需要注意的是:Substitution控件的MethodName属性所调用的方法必须满足以下三个条件。

  1)必须是静态static方法

  2)返回值必须是String类型

  3)参数类型必须是HttpContext类型

 

五:如何实现"应用程序缓存"?

  前面说到,应用程序缓存是用来存储与应用程序相关的对象,主要由Cache类来实现。

  第一步当然要添加using System.Web.Caching的命名空间。   

  1)添加缓存:

  • Cache[bookInfo"] = bookInfo;//这里就是缓存一个图书信息的对象。

  那么现在假如说我们要设置缓存的有效期,就必须用到Cache的静态方法Add(),里设置缓存了。

  • Cache.Add("key","缓存测试",null,DeteTime.Now.AddSeconds(6),TimeSpan.Zero,CacheItemPriority.High,null);

  可以看到使用Add方法,七个参数必须写完整才生效,所以灵活性不够好。

  • 使用Insert方法来实现多钟方式的方法重载。
    • Cache.Insert("key1","使用insert缓存");//只需要键和值两个参数就可以添加缓存。
    • Cache.Insert("key2","测试依赖性的缓存",new System.Web.Caching.CacheDependency(null,dependencies));//添加依赖项的缓存
    • Cache.Insert("key3","设置有效期的缓存",DateTime.Now.AddMinutes(1d),System.Web.Caching.Cache.NoslidingExpiration);//设置有效期
    • Cache.Insert("key4","测试添加优先级缓存",null,Cache.NoAbsoluteExpiration,Cache.NoAbsoluteExpiration,CacheItemPriorit.High,null);//添加优先级的缓存

  2)检索缓存

  由于缓存容易丢失,所以我们从缓存中取数据之前先要判断改缓存项是否存在。

  通常这样检测:Cache["key"] 是否为 null。   

  3)移除应用程序的缓存对象

  • 自动移除:缓存超过有效期,依赖性更改,缓存项就会自动移除。
  • 显式移除:Cache.Remove("key") ; //键名

下面来举一个列子,说明应用程序缓存对象的用法。

private void CacheBookInfo(int bookId){

    Book book = null;
//如果缓存为空,则说明是第一次加载,这时就缓存图书信息
  if(Cache[bookId.ToString()]==null){
    book = bookManager.GetBookById(bookId);
}else{
    book = (Book) Cache[bookId.ToString()];
  }
  
  //假如该书有很高的访问量,则可以对该图书进行缓存
  if(book.Clicks>20000){
    Cache[bookId.ToString()] = book;
  }
  //下面就可以将book中的信息显示到页面了
  lblBookName.Text = book.BookName;
  //...
}

那么现在,我们为什么要使用缓存?缓存有哪几种方式?分别是怎样实现的?如果这三个问题弄明白了,就说明你对Asp.Net的缓存机制已经有了足够了解了。

ASP.NE的缓存技术提高Web站点的性能的更多相关文章

  1. 042. asp.net使用缓存来提高母版页的访问性能

    Asp.Net缓存技术是一项非常重要的技术, 当一个页面被频繁的访问, 如果不使用缓存技术, 那么每访问一次就要回发一次服务器, 显然这样对服务器造成很大的负担, 所以, 可以在被频繁访问的页面中设置 ...

  2. 成倍提高服务器的负载能力:浅谈Jexus的ASP.NET前置缓存技术

    一.什么是“ASP.NET前置缓存”     ASP.NET前置缓存,是Jexus特色功能之一,是指Jexus把开发者指定的ASP.NET网页某一时刻的内容,缓存到专用的高速缓冲区中,在指定的时间内, ...

  3. 详解PHP操作Memcache缓存技术提高响应速度的方法

    本文转载http://blog.csdn.net/zhihua_w  不错的博客,仅供本人学习之用 一般来说,如果并发量不大的情况,使不使用缓存技术并没有什么影响,但如果高并发的情况,使用缓存技术就显 ...

  4. ASP.NET Core 缓存技术 及 Nginx 缓存配置

    前言 在Asp.Net Core Nginx部署一文中,主要是讲述的如何利用Nginx来实现应用程序的部署,使用Nginx来部署主要有两大好处,第一是利用Nginx的负载均衡功能,第二是使用Nginx ...

  5. Asp.Net Cache缓存技术学习

    本文参考自Fish Li的细说 ASP.NET Cache 及其高级用法 一.前言,相信大多数做网站开发的都知道缓存技术对于网站的重要性,它对于网站的性能优化起着至关重要的作用. 关于缓存的技术大致有 ...

  6. ASP.NET Core如何使用压缩中间件提高Web应用程序性能

    前言 压缩可以大大的降低我们Web服务器的响应速度,压缩从而提高我们网页的加载速度,以及节省一定的带宽. 何时使用相应压缩中间件 在IIS,Apache,Nginx中使用基于服务端的响应压缩技术.中间 ...

  7. PHP利用memcache缓存技术提高响应速度

    PHP下memcache模块是一个高效的守护进程,提供用于内存缓存的过程式程序和面向对象的方便的接口,特别是对于设计动态web程序时减少对数据库的访问.memcache也提供用于通信对话(sessio ...

  8. 如何提高web页面的性能

    1.浏览器渲染原理解析 想要提高网页的性能,首要的便是要理解浏览器渲染原理,下面关于浏览器的原理解析,我们以chrome内核webkit为例,其他内核的浏览器原理也基本大同小异,可触类旁通. 如上图所 ...

  9. 掌握提高 Web 应用的性能的方法 之 优化 PHP 和 Laravel

    Laravel 有很多东西.但是快不是其中之一.让我们学习一些优化技巧,以加快运行速度! 自从 Laravel 诞生以来,没有一个 PHP 开发人员不受她的影响.他们是喜欢 Laravel 提供的快速 ...

随机推荐

  1. 【Vmware】已有镜像文件的导入

    1  虚拟机文件夹中各个文件简介 在创建虚拟机的时候会把相关的文件保存到一个文件夹中.我的机器是Windows 7,64位 ,保存的路径是: C:\Users\User\Documents\Virtu ...

  2. dom树的介绍,及原理分析

    三.解析和DOM树的构建 1.解析: 由于解析渲染引擎是一个非常重要的过程,我们将会一步步的深入,现在让我们来介绍解析. 解析一个文档,意味着把它转换为一个有意义的结构——代码可以了解和使用的东西,解 ...

  3. SVN备份教程(二)

    上次的博文中SVN备份教程(一)我们简单介绍了一下SVN备份是如何操作的,今天我们接着将上次的问题进行优化. 1.问题回顾 在讲之前,我们先来将上次的问题重申一下.之前的SVN备份存在的问题很简单,每 ...

  4. 微软职位内部推荐-Principal Dev Manager for Windows Phone Apps

    微软近期Open的职位: Location: China, BeijingDivision: Operations System Group Engineering Group OverviewOSG ...

  5. Timeline

    Timeline面板   Chrome开发者工具详解(3)-Timeline面板 注: 这一篇主要讲解面板Timeline,参考了Google的相关文档,主要用于公司内部技术分享.. 更新时间:201 ...

  6. windows server 2008 r2电脑历史操作记录

    1.看计算机哪天运行过.    在系统盘下的Windows\Tasks文件夹下找到文件SCHEDLGU.TXT. 2.看你最近打开过什么文件(非程序)或者文件夹    开始-->运行--> ...

  7. iOS 支付宝应用(备用参考2)

    接入前期准备工作包括商户签约和密钥配置 步骤1:  启动IDE(如Xcode),把iOS包中的压缩文件中以下文件拷贝到项目文件夹下, 并导入到项目工程中. AlipaySDK.bundle    Al ...

  8. bnuoj 20832 Calculating Yuan Fen(暴力模拟)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=20832 [题意]: 给你一串字符串,求一个ST(0<ST<=10000),对字符串中字符 ...

  9. 1509 -- Glass Beads POJ

    题意:求一个字符串的最小表示的开始下标 就当模板题写了 把字符串重复一遍,再建后缀自动机,贪心的选最小字典序在上面走len步 因为走出来的一定是子串,长度又是len,所以一定是原来的字符串旋转得到的, ...

  10. No qualifying bean of type [com.shyy.web.service.TreeMapper] found for dependency

    异常信息: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.sp ...