asp.net缓存机制

简介:

一、缓存的类别

1、页面输出ASP.NET数据缓存

页面输出缓存是一种传统级别的相对简单的缓存机制。它将页面数据缓存在服务器内存中,当有客户端再次请求这些内容的时候,服务器可以直接将这些页面数据输出,直到数据缓存过期。

页面输出缓存有两种使用方法:

使用@ OutputCache指令,常见代码如:

〈%@ OutputCache Duration="60" VaryByParam="sID" Location="Any"%〉

以上例子定义了页面输出缓存有效时间为60s,60s后新建缓存;缓存版本因页面传递的sID参数不同而不同;Location="Any"指定了。

使用页面输出缓存API该方法在页面的程序部分执行,常见代码如:

Response.Cache.SetExpires(DataTime.Now.AddSeconds(60));

上句设定页面缓存有效时间为60s。

2、页面部分缓存

有时候我们可能并不希望把整个页面都缓存起来,而只是缓存页面的某个部分。常用方法有3种:

使用@ OutputCache指令

这种方法的实质是:将需要缓存的这部分内容做成用户自定义控件,然后为自定义控件设置页面缓存代码,方法同页面输出缓存。

3、应用程序数据缓存

ASP.NET数据缓存的主要功能是在内存中存储各种与应用程序相关的对象。方法有三种: 
指定键和值

Cache["keyName"] = "123";

该语句将新建或者重写名称为txtName的缓存,并赋值为123。

使用Add方法

Cache.Add("keyName","123",null,DataTime.Now.AddSeconds(60),TimeSpan.Zero, CacheItemPriority.High,onRemove);

该句实现上例同样的功能,并设定其缓存依赖项为null;缓存有效时间为60s;最后一次访问所添加对象时到该对象过期时间的时间间隔为零(TimeSpan.Zero);缓存对象优先级为High;当缓存被删除时调用委托名称为onRemove。

使用Insert方法

Insert方法和Add方法使用方法基本一致,但Insert方法还有几种自己的重载后的方法,例如:

Cache.Insert("keyName","123");

4、缓存依赖

ASP.NET数据缓存的好处很多,但他也有弊端。比如说数据的实时性,用户获取的页面可能是几十秒甚至是几个小时以前的服务器缓存信息,这一点对于实时性要求比较高的程序来说是不可容忍的。这时候我们可以通过设定缓存依赖,通过对依赖文件的更改变动情况的判断,来决定程序是否需要重建(刷新)缓存。


缓存依赖的方式有很多种,这里我们着重讲解自定义依赖缓存: 自定义缓存依赖

代码:

string fileName = Server.MapPath

("file.xml");//设置文件路径

DateTime dt = DateTime.Now;

//设置跟踪依赖文件的开始时间

CacheDependency dep = new CacheDependency

(fileName,dt);//创建依赖对象

 

 

二、缓存使用举例

 

ASP.NET缓存数据技巧三则

 

 
  1. ﹤%...@ Page Language="C#" AutoEventWireup="true" CodeFile="date.aspx.cs" Inherits="date" %﹥    
  2.    
  3. 2.  ﹤%...@ OutputCache Duration="60" VaryByParam="CustomerID" %﹥    
  4.    
  5. 3.  ﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥    
  6.    
  7. 4.     
  8.    
  9. 5.  ﹤html xmlns="http://www.w3.org/1999/xhtml" ﹥    
  10.    
  11. 6.  ﹤head runat="server"﹥    
  12.    
  13. 7.      ﹤title﹥ASP.NET数据缓存﹤/title﹥    
  14.    
  15. 8.  ﹤/head﹥    
  16.    
  17. 9.  ﹤body﹥    
  18.    
  19. 10.     ﹤form id="form1" runat="server"﹥    
  20.    
  21. 11.     ﹤div﹥    
  22.    
  23. 12.           ﹤asp:GridView ID="GridView1" runat="server" BackColor="LightGoldenrodYellow"   
  24.    
  25. 13.             BorderColor="Tan" BorderWidth="1px" CellPadding="2" ForeColor="Black" GridLines="None"﹥    
  26.    
  27. 14.             ﹤FooterStyle BackColor="Tan" /﹥    
  28.    
  29. 15.             ﹤SelectedRowStyle BackColor="DarkSlateBlue" ForeColor="GhostWhite" /﹥    
  30.    
  31. 16.             ﹤PagerStyle BackColor="PaleGoldenrod" ForeColor="DarkSlateBlue" HorizontalAlign="Center" /﹥    
  32.    
  33. 17.             ﹤HeaderStyle BackColor="Tan" Font-Bold="True" /﹥    
  34.    
  35. 18.             ﹤AlternatingRowStyle BackColor="PaleGoldenrod" /﹥    
  36.    
  37. 19.         ﹤/asp:GridView﹥    
  38.    
  39. 20.          ﹤br /﹥    
  40.    
  41. 21.         ﹤br /﹥    
  42.    
  43. 22.         ﹤asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/date.aspx?CustomerID=16"﹥16﹤/asp:HyperLink﹥    
  44.    
  45. 23.         ﹤asp:HyperLink ID="HyperLink2" runat="server" NavigateUrl="~/date.aspx?CustomerID=19"﹥19﹤/asp:HyperLink﹥    
  46.    
  47. 24.         ﹤/div﹥    
  48.    
  49. 25.     ﹤/form﹥    
  50.    
  51. 26. ﹤/body﹥    
  52.    
  53. 27. ﹤/html﹥protected void Page_Load(object sender, EventArgs e)    
  54.    
  55. 28.     ...{    
  56.    
  57. 29.         string conn, comm, id;    
  58.    
  59. 30.         if (Request.QueryString["CustomerID"] == null)    
  60.    
  61. 31.         ...{    
  62.    
  63. 32.             id = "16";    
  64.    
  65. 33.         }    
  66.    
  67. 34.         else   
  68.    
  69. 35.         ...{     
  70.    
  71. 36.             id = Request.QueryString["CustomerID"];    
  72.    
  73. 37.         }    
  74.    
  75. 38.             
  76.    
  77. 39.         conn = "Server=WEB\SQLEXPRESS;Uid=moon;Pwd=1qaz2wsx;Database=store";    
  78.    
  79. 40.         comm = "SELECT * FROM orders WHERE CustomerID =" + id;    
  80.    
  81. 41.    
  82.    
  83. 42.         SqlDataAdapter da = new SqlDataAdapter(comm, conn);    
  84.    
  85. 43.         DataSet ds = new DataSet();    
  86.    
  87. 44.         da.Fill(ds);    
  88.    
  89. 45.    
  90.    
  91. 46.         GridView1.DataSource = ds.Tables[0];    
  92.    
  93. 47.         GridView1.DataBind();    
  94.    
  95. 48.             
  96.    
  97. 49.         Response.Write(DateTime.Now.ToString());    
  98.    
  99. 50.     }   

 

运行后分别点击 16和19会根据这两个关键字SELECT出不同的数据,这时候根据我们传递的两个参数会分别建立两个缓存页,在每点击一个关键字后请记住显示的时间,再反复刷新看看时间有什么变化!好了接下来讲一下数据缓存。
ASP.NET数据缓存( Data Caching)
System.Web.Caching空间里有一个类“Cache”我们可以通过这个类对数据进行缓存。
最简单的缓存方法: Cache["MyCacheString"] = "My CSDN BLOG!!!"; 通过赋值的形式建立一个缓存,再通过赋值的形式取出缓存:myLabel.Text = Cache["MyCacheString"].ToString();这种方法使用非常的简单可是功能上受到了一些限制,为了更完善的订制缓存,应该使用Cache.Insert()方法,下面举个例子:
页面里只需要放一下 GridView就可以了

 

 
  1. using System;    
  2.    
  3. 52. using System.Web.Caching;    
  4.    
  5. 53. using System.Data;    
  6.    
  7. 54. using System.Data.SqlClient;    
  8.    
  9. 55. using System.Configuration;    
  10.    
  11. 56. using System.Collections;    
  12.    
  13. 57. using System.Web;    
  14.    
  15. 58. using System.Web.Security;    
  16.    
  17. 59. using System.Web.UI;    
  18.    
  19. 60. using System.Web.UI.WebControls;    
  20.    
  21. 61. using System.Web.UI.WebControls.WebParts;    
  22.    
  23. 62. using System.Web.UI.HtmlControls;    
  24.    
  25. 63.    
  26.    
  27. 64. public partial class DataCache : System.Web.UI.Page    
  28.    
  29. 65. ...{    
  30.    
  31. 66.     DataView dv;//先声明一个数据视图用来存放数据库里的数据表    
  32.    
  33. 67.    
  34.    
  35. 68.     protected void Page_Load(object sender, EventArgs e)    
  36.    
  37. 69.     ...{    
  38.    
  39. 70.         dv = (DataView)Cache["ds"];//从ASP.NET数据缓存中读取数据表    
  40.    
  41. 71.    
  42.    
  43. 72.         if (dv == null)//如果缓存是空的,就建立数据库连接,从数据库里读数据    
  44.    
  45. 73.         ...{    
  46.    
  47. 74.             string conn, comm;    
  48.    
  49. 75.             conn = "Server=WEB\SQLEXPRESS;Uid=moon;Pwd=1qaz2wsx;Database=store";    
  50.    
  51. 76.             comm = "SELECT * FROM orders";    
  52.    
  53. 77.    
  54.    
  55. 78.             SqlDataAdapter da = new SqlDataAdapter(comm, conn);    
  56.    
  57. 79.             DataSet ds = new DataSet();    
  58.    
  59. 80.             da.Fill(ds);    
  60.    
  61. 81.             dv = ds.Tables[0].DefaultView;    
  62.    
  63. 82.             //下面这句是关键,具体参数后面介绍    
  64.    
  65. 83.             Cache.Insert("ds", dv, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(3));    
  66.    
  67. 84.             Databind();    
  68.    
  69. 85.             Label1.Text = DateTime.Now.ToString();//参考用的时间,可有可无    
  70.    
  71. 86.         }    
  72.    
  73. 87.         else   
  74.    
  75. 88.         ...{    
  76.    
  77. 89.             Databind();    
  78.    
  79. 90.             Response.Write("Is Cache Data!!!");//此句可有可无    
  80.    
  81. 91.         }    
  82.    
  83. 92.     }      
  84.    
  85. 93.         
  86.    
  87. 94.     protected void Databind()//自定义的数据绑定方法    
  88.    
  89. 95.     ...{    
  90.    
  91. 96.         GridView1.DataSource = dv;    
  92.    
  93. 97.         GridView1.DataBind();    
  94.    
  95. 98.     }    
  96.    
  97. 99. }   

 

ASP.NET数据缓存参数说明
Cache.Insert (String, Object, CacheDependency, DateTime, TimeSpan) 1是缓存的名称, 2是缓存的数据对象,3是缓存键依赖项,通常为Null,4是过期时间,如果使用相对过期时间则设为NoAbsoluteExpiration,5是可调过期时间,如果参数4使用了固定过期时间,则此参数要设成NoSlidingExpiration。呵呵是不是看的有点晕啊,举两个具体例子说一下过期时间的问题
Cache.Insert("ds", dv, null,DateTime.Now.AddMinutes(5) , System.Web.Caching.Cache.NoSlidingExpiration);
在这个例子里当缓存建立后过 5分钟就过期。
Cache.Insert("ds", dv, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(5));
这个例子里缓存建立后,过期时间为可调,比如 1:20秒建立的缓存过期时间应该是6:20但如果在3:20有人访问了缓存,则过期时间将调整为8:20,以此类推……
我们在 VS2005里建立一个测试看看使用缓存前和使用缓存后的性能变化吧!看到没有,没有缓存前用了0.43秒而使用缓存后只用了0.08秒性能相差5倍多啊!!!
三、ASP.NET缓存数据技巧三则
ASP.NET 缓存数据技巧:访问缓存的值
由于缓存中所存储的信息为易失信息,即该信息可能由 ASP.NET 移除,因此建议先确定该项是否在缓存中。如果不在,则应将它重新添加到缓存中,然后检索该项。
string cachedString;
if (Cache["CacheItem"] !=  null)
{
cachedString = ( string)Cache["CacheItem"];
}
else
{
//缓存不存在时
Cache.Insert("CacheItem", "Hello, World.")
cachedString = ( string)Cache["CacheItem"];
}
ASP.NET 缓存数据技巧:删除缓存项
由于以下任一原因,缓存中的数据可能会自动移除:缓存已满、该项已过期、依赖项发生更改。注意:如果调用 Insert 方法,并向缓存中添加与现有项同名的项,则将从缓存中删除该旧项。显示删除缓存的值:
Cache.Remove("MyCacheKey");
ASP.NET 缓存数据技巧:删除缓存项时通知应用程序
从缓存中移除项时通知应用程序,可能非常有用。例如,可能具有一个缓存的报告,创建该报告需花费大量的时间进行处理。当该报告从缓存中移除时,希望重新生成该报告,并立即将其置于缓存中,以便下次请求该报告时,用户不必等待对此报告进行处理。
ASP.NET 提供了CacheItemRemovedCallback 委托,在从缓存中移除项时能够发出通知。还提供 CacheItemRemovedReason 枚举,用于指定移除缓存项的原因。举例:假设有一个 ReportManager 对象,该对象具有两种方法,即 GetReport 和 CacheReport。GetReport 报告方法检查缓存以查看报告是否已缓存;如果没有,该方法将重新生成报告并将其缓存。CacheReport 方法具有与 CacheItemRemovedCallback 委托相同的函数签名;从缓存中移除报告时,ASP.NET 会调用 CacheReport 方法,然后将报告重新添加到缓存中。
创建一个 ASP.NET 网页,该网页将调用类中用于将项添加到缓存中的方法。
protected  void Page_Load( object sender, EventArgs e)
{
this.Label1.Text = ReportManager.GetReport();
}
创建用于在从缓存中删除项时处理通知的完整类ReportManager。
using System;
using System.Web;
using System.Web.Caching;
public  static  class ReportManager
{
private  static  bool _reportRemovedFromCache =  false;
static ReportManager() { }
//从缓存中获取项
public  static String GetReport()
{
lock ( typeof(ReportManager))
{
if (HttpContext.Current.Cache["MyReport"] !=  null)
{ //存在MyReport缓存项,返回缓存值
return ( string)HttpRuntime.Cache["MyReport"];
}
else
{ //MyReport缓存项不存在,则创建MyReport缓存项
CacheReport();
return ( string)HttpRuntime.Cache["MyReport"];
}
}
}
//将项以 MyReport 的名称添加到缓存中,并将该项设置为在添加到缓存中后一分钟过期。
//并且该方法注册 ReportRemoveCallback 方法,以便在从缓存中删除项时进行调用。
public  static  void CacheReport()
{
lock ( typeof(ReportManager))
{
HttpContext.Current.Cache.Add("MyReport", CreateReport(),  null, DateTime.MaxValue,  new TimeSpan(0, 1, 0), System.Web.Caching.CacheItemPriority.Default, ReportRemovedCallback);
}
}
//创建报告,该报告时MyReport缓存项的值
private  static  string CreateReport()
{
System.Text.StringBuilder myReport =  new System.Text.StringBuilder();
myReport.Append("Sales Report< br />");
myReport.Append("2005 Q2 Figures< br />");
myReport.Append("Sales NE Region - $2 million< br />");
myReport.Append("Sales NW Region - $4.5 million< br />");
myReport.Append("Report Generated: " + DateTime.Now.ToString()
+ "< br />");
myReport.Append("Report Removed From Cache: " +
_reportRemovedFromCache.ToString());
return myReport.ToString();
}
//当从缓存中删除项时调用该方法。
public  static  void ReportRemovedCallback(String key,  object value, CacheItemRemovedReason removedReason)
{
_reportRemovedFromCache =  true;
CacheReport();
}
}
不应在 ASP.NET 页中实现回调处理程序,因为在从缓存中删除项之前该页可能已被释放,因此用于处理回调的方法将不可用,应该在非ASP.NET的程序集中实现回调处理程序。为了确保从缓存中删除项时处理回调的方法仍然存在,请使用该方法的静态类。但是,静态类的缺点是需要保证所有静态方法都是线程安全的,所以使用lock关键字。


本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1081796
相关文章
|
3月前
|
缓存 Java 数据库连接
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
文章介绍了MyBatis的缓存机制,包括一级缓存和二级缓存的配置和使用,以及如何整合第三方缓存EHCache。详细解释了一级缓存的生命周期、二级缓存的开启条件和配置属性,以及如何通过ehcache.xml配置文件和logback.xml日志配置文件来实现EHCache的整合。
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
|
4月前
|
缓存 应用服务中间件 nginx
Web服务器的缓存机制与内容分发网络(CDN)
【8月更文第28天】随着互联网应用的发展,用户对网站响应速度的要求越来越高。为了提升用户体验,Web服务器通常会采用多种技术手段来优化页面加载速度,其中最重要的两种技术就是缓存机制和内容分发网络(CDN)。本文将深入探讨这两种技术的工作原理及其实现方法,并通过具体的代码示例加以说明。
436 1
|
22天前
|
存储 缓存 监控
后端开发中的缓存机制:深度解析与最佳实践####
本文深入探讨了后端开发中不可或缺的一环——缓存机制,旨在为读者提供一份详尽的指南,涵盖缓存的基本原理、常见类型(如内存缓存、磁盘缓存、分布式缓存等)、主流技术选型(Redis、Memcached、Ehcache等),以及在实际项目中如何根据业务需求设计并实施高效的缓存策略。不同于常规摘要的概述性质,本摘要直接点明文章将围绕“深度解析”与“最佳实践”两大核心展开,既适合初学者构建基础认知框架,也为有经验的开发者提供优化建议与实战技巧。 ####
|
17天前
|
缓存 Java 数据库连接
MyBatis缓存机制
MyBatis提供两级缓存机制:一级缓存(Local Cache)默认开启,作用范围为SqlSession,重复查询时直接从缓存读取;二级缓存(Second Level Cache)需手动开启,作用于Mapper级别,支持跨SqlSession共享数据,减少数据库访问,提升性能。
27 1
|
21天前
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
35 4
|
4月前
|
SQL 缓存 开发框架
分享一个 .NET EF6 应用二级缓存提高性能的方法
分享一个 .NET EF6 应用二级缓存提高性能的方法
|
2月前
|
存储 缓存 负载均衡
Nginx代理缓存机制
【10月更文挑战第2天】
101 4
|
2月前
|
存储 缓存 NoSQL
深入理解后端缓存机制的重要性与实践
本文将探讨在后端开发中缓存机制的应用及其重要性。缓存,作为提高系统性能和用户体验的关键技术,对于后端开发来说至关重要。通过减少数据库访问次数和缩短响应时间,缓存可以显著提升应用程序的性能。本文将从缓存的基本概念入手,介绍常见的缓存策略和实现方式,并通过实例展示如何在后端开发中有效应用缓存技术。最后,我们将讨论缓存带来的一些挑战及其解决方案,帮助您在实际项目中更好地利用缓存机制。
|
3月前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
77 8
|
3月前
|
缓存 Java Python
python垃圾回收&缓存机制
python垃圾回收&缓存机制