ASP.NET页面缓存常见的4种方式

本文为大家分享了4种常见的ASP.NET页面缓存方式,供大家参考,具体内容如下

1、分布式缓存Memcached,教程下载

2、内存缓存,此占用服务器资源

#region 内存缓存
 public class MemoryCache
 {
 #region 写
 /// <summary>
 /// 向内存写入数据缓存
 /// </summary>
 /// <remarks>TOMMYHU2011-7-28 10:25创建</remarks>
 /// <param name="cachekey">缓存标识关键字</param>
 /// <param name="cacheresult">需要存放的数据</param>
 /// <param name="cachetime">单位秒</param>
 public static void InertMemoryCache(string cachekey, object cacheresult, int cachetime)
 {
 if (cacheresult != null)
 {
  System.Web.HttpRuntime.Cache.Insert(cachekey, cacheresult, null
  , System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(cachetime));
 }
 }
 #endregion
 #region 读
 /// <summary>
 /// 根据缓存标识读取内存缓存信息
 /// </summary>
 /// <remarks>TOMMYHU2011-7-28 10:25创建</remarks>
 /// <param name="cachekey">缓存标识关键字</param>
 /// <returns>内存缓存数据</returns>
 public static object ReadMemoryCache(string cachekey)
 {
 object obj = System.Web.HttpRuntime.Cache.Get(cachekey);
 if (obj != null)
 {
  return obj;
 }
 return null;
 }
 #endregion
 }
 #endregion 

3、XML缓存,这种最为常见

 #region xml缓存
 public static class XmlCache
 {
 private static string m_CacheFolderName = null; 

 #region 获取/生成缓存文件方法(无cmdParams)
 /// <summary>
 /// 获取/生成缓存文件方法(DataTable)
 /// </summary>
 /// <param name="SQL">用于将Sql转化为MD5字符串</param>
 /// <param name="CacheFilePath">存放Xml文件的相对路径(根目录已预置)</param>
 /// <param name="CacheTime">缓存时间</param>
 /// <param name="DataUsed">使用的数据库的链接字符串</param>
 /// <returns></returns>
 public static DataTable CacheFileByDataTable(string SQL, string CacheFilePath, int CacheTime)
 {
 SQLHelper.SQLHelper QuerySql = new SQLHelper.SQLHelper();
 if (CacheFilePath != string.Empty && CacheFilePath.StartsWith("/"))
 {
  CacheFilePath = CacheFilePath.Remove(0, 1);
 } 

 string SqlMd5 = SQL;//用于将Sql转化为MD5字符串 

 string StrSqlByMd5 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(SqlMd5, "MD5");//生成的Md5文件名 

 string MyCacheFilePath = ""; 

 if (CacheTime >= 10000)//如果大于20天的话系统默认为持久
 {
  MyCacheFilePath = XmlCache.CacheFolderNameP + CacheFilePath;//用于存放Xml文件的相对路径
 }
 else
 {
  MyCacheFilePath = XmlCache.CacheFolderName + CacheFilePath;//用于存放Xml文件的相对路径
 } 

 int MyCacheTime = CacheTime;//缓存时间(分) 

 DataTable dt = new DataTable();//存放数据记录的DataTable 

 DataTable CacheDt = new DataTable();//获取缓存数据记录的DataTable 

 //尝试获取缓存数据记录
 try
 {
  CacheDt = DataTableCache.GetDTCache(MyCacheTime, MyCacheFilePath, StrSqlByMd5);
 }
 catch
 {
  CacheDt = null;
 }
 if (CacheDt != null)//获取到缓存的XML文件
 {
  dt = CacheDt;
 }
 else//未获取到缓存的XML文件
 {
  //生成DataTable(如果用Query查询请用Query.ProcessSql方法)
  //dt = Query.ProcessSql(SqlMd5, DataUsed);
  dt = QuerySql.retDT(SQL); 

  //将DataTable存为XML文件
  try
  {
  if (dt.DataSet != null)
  {
  dt.DataSet.Tables.Remove(dt);
  } 

  DataTableCache.SetDTCache(MyCacheFilePath, StrSqlByMd5, dt);
  }
  catch (Exception ex)
  {
  //Log.GetComLogger().Error("将DataTable存为XML文件出错:" + ex.Message);
  }
 }
 return dt;
 } 

 /// <summary>
 /// 获取/生成缓存文件方法(DataSet) Add By WJ 08-10-23
 /// </summary>
 /// <param name="SQL">用于将Sql转化为MD5字符串</param>
 /// <param name="CacheFilePath">存放Xml文件的相对路径(根目录已预置)</param>
 /// <param name="CacheTime">缓存时间</param>
 /// <param name="DBName">使用的数据库的链接字符串</param>
 /// <returns></returns>
 public static DataSet CacheFileByDataSet(string SQL, string CacheFilePath, int CacheTime)
 {
 SQLHelper.SQLHelper QuerySql = new SQLHelper.SQLHelper();
 if (CacheFilePath != string.Empty && CacheFilePath.StartsWith("/"))
 {
  CacheFilePath = CacheFilePath.Remove(0, 1);
 } 

 string SqlMd5 = SQL;//用于将Sql转化为MD5字符串 

 string StrSqlByMd5 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(SqlMd5, "MD5");//生成的Md5文件名 

 string MyCacheFilePath = XmlCache.CacheFolderName + CacheFilePath;//用于存放Xml文件的相对路径 

 int MyCacheTime = CacheTime;//缓存时间(分) 

 DataSet ds = new DataSet();//存放数据记录的DataSet 

 DataSet CacheDs = new DataSet();//获取缓存数据记录的DataSet 

 //尝试获取缓存数据记录
 try
 {
  CacheDs = DataTableCache.GetDSCache(MyCacheTime, MyCacheFilePath, StrSqlByMd5);
 }
 catch
 {
  CacheDs = null;
 }
 if (CacheDs != null)//获取到缓存的XML文件
 {
  ds = CacheDs;
 }
 else//未获取到缓存的XML文件
 {
  //生成DataSet
  //ds = Query.ProcessMultiSql(SqlMd5, DBName);
  ds = QuerySql.retDS(SQL); 

  //将DataSet存为XML文件
  try
  {
  DataTableCache.SetDSCache(MyCacheFilePath, StrSqlByMd5, ds);
  }
  catch
  { }
 }
 return ds;
 } 

 #endregion 

 #region 获取/生成缓存文件方法(有cmdParams)
 /// <summary>
 /// 获取/生成缓存文件方法(DataTable)
 /// </summary>
 /// <param name="SQL">用于将Sql转化为MD5字符串</param>
 /// <param name="CacheFilePath">存放Xml文件的相对路径(根目录已预置)</param>
 /// <param name="CacheTime">缓存时间</param>
 /// <param name="DataUsed">使用的数据库的链接字符串</param>
 /// <param name="cmdParams">以数组形式提供SqlCommand命令中用到的参数列表</param>
 /// <returns></returns>
 public static DataTable CacheFileByDataTable(string SQL, string CacheFilePath, int CacheTime, string DBConstr, params SqlParameter[] cmdParams)
 {
 SQLHelper.SQLHelper QuerySql = new SQLHelper.SQLHelper();
 if (CacheFilePath != string.Empty && CacheFilePath.StartsWith("/"))
 {
  CacheFilePath = CacheFilePath.Remove(0, 1);
 } 

 string SqlMd5 = SQL;//用于将Sql转化为MD5字符串 

 string sqlmd5params = SQL;
 if (cmdParams != null)
 {
  for (int i = 0; i < cmdParams.Length; i++)
  {
  if (cmdParams[i].Value != null)
  sqlmd5params += cmdParams[i].Value.ToString();
  }
 } 

 string StrSqlByMd5 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sqlmd5params, "MD5");//生成的Md5文件名 

 string MyCacheFilePath = ""; 

 if (CacheTime >= 10000)//如果大于20天的话系统默认为持久
 {
  MyCacheFilePath = XmlCache.CacheFolderNameP + CacheFilePath;//用于存放Xml文件的相对路径
 }
 else
 {
  MyCacheFilePath = XmlCache.CacheFolderName + CacheFilePath;//用于存放Xml文件的相对路径
 } 

 int MyCacheTime = CacheTime;//缓存时间(分) 

 DataTable dt = new DataTable();//存放数据记录的DataTable 

 DataTable CacheDt = new DataTable();//获取缓存数据记录的DataTable 

 //尝试获取缓存数据记录
 CacheDt = DataTableCache.GetDTCache(MyCacheTime, MyCacheFilePath, StrSqlByMd5); 

 if (CacheDt != null)//获取到缓存的XML文件
 {
  dt = CacheDt;
 }
 else//未获取到缓存的XML文件
 {
  //生成DataTable(如果用Query查询请用Query.ProcessSql方法)
  //dt = Query.ProcessSql(SqlMd5, DataUsed);
  dt = QuerySql.retDT(SqlMd5);
  DataTable dt1 = new DataTable();
  if (dt != null)
  {
  dt1 = dt.Copy();
  }
  //将DataTable存为XML文件
  DataTableCache.SetDTCache(MyCacheFilePath, StrSqlByMd5, dt1);
 }
 return dt;
 } 

 /// <summary>
 /// 获取/生成缓存文件方法(DataSet) Add By wjf
 /// </summary>
 /// <param name="SQL">用于将Sql转化为MD5字符串</param>
 /// <param name="CacheFilePath">存放Xml文件的相对路径(根目录已预置)</param>
 /// <param name="CacheTime">缓存时间</param>
 /// <param name="DBName">使用的数据库的链接字符串</param>
 /// <param name="cmdParams">以数组形式提供SqlCommand命令中用到的参数列表</param>
 /// <returns></returns>
 public static DataSet CacheFileByDataSet(string SQL, string CacheFilePath, int CacheTime, string DBConstr, params SqlParameter[] cmdParams)
 {
 SQLHelper.SQLHelper QuerySql = new SQLHelper.SQLHelper();
 string SqlMd5 = SQL;//用于将Sql转化为MD5字符串 

 string sqlmd5params = SQL;
 if (cmdParams != null)
 {
  for (int i = 0; i < cmdParams.Length; i++)
  {
  if (cmdParams[i].Value != null)
  sqlmd5params += cmdParams[i].Value.ToString();
  }
 } 

 string StrSqlByMd5 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sqlmd5params, "MD5");//生成的Md5文件名 

 string MyCacheFilePath = XmlCache.CacheFolderName + CacheFilePath;//用于存放Xml文件的相对路径 

 int MyCacheTime = CacheTime;//缓存时间(分) 

 DataSet ds = new DataSet();//存放数据记录的DataSet 

 DataSet CacheDs = new DataSet();//获取缓存数据记录的DataSet 

 //尝试获取缓存数据记录
 CacheDs = DataTableCache.GetDSCache(MyCacheTime, MyCacheFilePath, StrSqlByMd5); 

 if (CacheDs != null)//获取到缓存的XML文件
 {
  ds = CacheDs;
 }
 else//未获取到缓存的XML文件
 {
  //生成DataSet
  //ds = Query.ProcessMultiSql(SqlMd5, DBName);
  ds = QuerySql.retDS(SqlMd5);
  DataSet ds1 = new DataSet();
  if (ds != null)
  {
  ds1 = ds.Copy();
  }
  //将DataSet存为XML文件
  DataTableCache.SetDSCache(MyCacheFilePath, StrSqlByMd5, ds1);
 }
 return ds;
 }
 #endregion 

 #region 非持久保持
 /// <summary>
 /// 非持久保持
 /// </summary>
 public static string CacheFolderName
 {
 get
 {
  if (m_CacheFolderName == null)//如果Global.asax中未定义路径
  {
  m_CacheFolderName = System.Configuration.ConfigurationManager.AppSettings.GetValues("CachePathRoot")[0];
  if (m_CacheFolderName == null)//如果Web.Config中未定义路径
  {
  return "/CacheData/" + DateTime.Now.ToString("yyyyMMdd") + "/";
  }
  else
  {
  return m_CacheFolderName + DateTime.Now.ToString("yyyyMMdd") + "/";
  }
  }
  else
  {
  return m_CacheFolderName + DateTime.Now.ToString("yyyyMMdd") + "/";
  }
 } 

 set
 {
  m_CacheFolderName = value;
 }
 }
 #endregion 

 #region 持久保存(例如存放MapBar缓存的数据或需要3个月以上更新的数据等)
 /// <summary>
 /// 持久保存(例如存放MapBar缓存的数据或需要3个月以上更新的数据等)
 /// </summary>
 public static string CacheFolderNameP
 {
 get
 {
  if (m_CacheFolderName == null)//如果Global.asax中未定义路径
  {
  m_CacheFolderName = System.Configuration.ConfigurationManager.AppSettings.GetValues("CachePathRoot")[0];
  if (m_CacheFolderName == null)//如果Web.Config中未定义路径
  {
  return "/CacheData/";
  }
  else
  {
  return m_CacheFolderName;
  }
  }
  else
  {
  return m_CacheFolderName;
  }
 } 

 set
 {
  m_CacheFolderName = value;
 }
 }
 #endregion
 }
 #endregion

4、DATATABLE缓存

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2016-11-15

Asp.net禁用页面缓存的方法总结

1.在Asp页面首部<head>加入  复制代码 代码如下: Response.Buffer   =   True      Response.ExpiresAbsolute   =   Now()   -   1      Response.Expires   =   0      Response.CacheControl   =   "no-cache"      Response.AddHeader   "Pragma",   "No-

设置ASP.NET页面不被缓存(客户端/服务器端取消缓存方法)

复制代码 代码如下: /// <summary> /// 设置页面不被缓存 /// </summary> private void SetPageNoCache() { Response.Buffer = true; Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1); Response.Expires = 0; Response.CacheControl = "no-cache"; Res

asp.net 页面输出缓存

主要用于不经常更新和修改,而在第一次编译是时要经过大量处理的数据.页面输出缓存是缓存的整个页面 使用很简单<%@ OutPutCache Duration="60" VaryByParam="none"%> Duration:缓存时间 VaryByParam:通过参数来更新缓存的内容 还有其他的一些属性 CacheProfile:调用WebConfig中的缓存时间 例如:WebCofig中 复制代码 代码如下: <system.web> &l

ASP.net Substitution 页面缓存而部分不缓存的实现方法

文件1:Deafault.aspx 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ outputcache duration="10" varybyparam="none" %> <!-

asp.net 使用驻留在页面中的Cache缓存常用可定时更新的数据

就是希望让Web应用程序从一开始运行到结束都一直存在,有人就说为什么不用Application呢?其实Cache是可以一段时间内自动更新数据的,而Application就无法做成这样的,另外Application在Web这种高并发的系统中一定要考虑线程安全的问题,Application本身就不是线程安全的,而Cache就是线程安全.所以一般我都会在很多对象中我只从Web开始运行的时候从数据库或文件里获取一次数据,在不同的页面中,都是使用Cache的,而且Cache中的数据可能弄成自动更新的,所以

ASP.NET 4中的可扩展输出缓存(可以缓存页面/控件等)

输出缓存的前世今生 ASP.NET 1.0引入输出缓存的概念,这使得开发者可以缓存页面.控件.控制器以及HTTP响应的输出到内存中.在后续的Web请求,ASP.NET就可以使用缓存中的内容更快响应. ASP.NET的输出缓存系统足够灵活,使得我们可以根据不同的查询字符串或者表单post参数来缓存不同版本的内容.例如test.aspx?category=Vegerable 和 test.aspx?category.aspx?category=Meat.它也允许我们根据浏览器类型或者用户语言偏好来缓

让html页面不缓存js的实现方法

本文实例讲述了让html页面不缓存js的实现方法.分享给大家供大家参考.具体实现方法如下: 很多朋友都会碰到这样的情况:如果我们页面加载了js的话下次打开时也会是调用这个js缓存文件,但对于我们调试时是非常的不方便了,本文就来谈论如何解决这一问题,下面一起来看看. 不缓存JS的方法其实挺简单,CSS在某种条件下也可以如此使用: 先让大家了解下不缓存的一个简单的原理: 当浏览不同Url时,浏览器会自动将当前访问的地址进行一次缓存:而第二次访问时着调用缓存下来的页面,从而达到页面快速加载(页面加载优

asp.net页面SqlCacheDependency缓存实例

缓存技术是asp.net程序设计中非常实用的技术,也是大型web程序设计中比较常见的技术.本文就以实例形式对此加以说明.具体如下: asp.net页面的SqlCacheDependency Sql缓存: Cahce/SqlCachePage.aspx页面代码如下: <%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile=&qu

ASP.NET页面在IE缓存的清除办法

以前没有注意到这个问题,今天在看Blog的时候发现有篇文章不错,或许以后值得借鉴: 一般情况下,WEB页面都会在Internet临时文件夹中有一个临时文件.我在操作IE时会出现这种情况:假如说有一个页面Page1.aspx,在我第一次访问后,它会在我的Internet临时文件夹里有一个Page1.aspx文件生成.之后,如果我改了Page1.aspx的数据后再次访问该页面,发现IE并没有对这个Page1.aspx的数据进行更新,反而打开的是我第一次访问的页面.为什么会这样,是因为IE自动(默认)

ASP.NET 2.0中的页面输出缓存

静态页面全部内容保存在服务器内存中.当再有请求时,系统将缓存中的相关数据直接输出,直到缓存数据过期.这个过程中,缓存不需要再次经过页面处理生命周期.这样可以缩短请求响应时间,提高应用程序性能.很显然,页面输出缓存适用于不需要频繁更新数据,而占用大量时间和资源才能编译生成的页面.对于那些数据经常更新的页面,则不适用.默认情况下,ASP.NET 2.0启用了页面输出缓存功能,但并不缓存任何响应的输出.开发人员必须通过设置,使得某些页面的响应成为缓存的一部分. 设置页面输出缓存可以使用以下两种方式:一

在ASP.NET 2.0中操作数据之十九:给编辑和新增界面增加验证控件

导言 在前面三节的示例中,GridView和DetailsView控件使用的是绑定列和CheckBoxField(绑定GridView和DetailsView时,通过智能标记可以令VS根据数据库自动增加对应的类型).当编辑GridView或者DetailsView中的一行时,非只读属性的绑定列将自动转为textbox,以便用户修改现有的数据.同样地,当在DetailsView控件中新增记录时,InsertVisible属性为true(默认值)的绑定列会呈现出空的textbox,以接受用户输入.C

在ASP.NET 2.0中操作数据之一:创建一个数据访问层

导言 作为web开发人员,我们的生活围绕着数据操作.我们建立数据库来存储数据,写编码来访问和修改数据,设计网页来采集和汇总数据.本文是研究在ASP.NET 2.0中实现这些常见的数据访问模式之技术的长篇系列教程的第一篇.我们将从创建一个软件框架开始,这个框架的组成部分包括一个使用强类型的DataSet的数据访问层(DAL),一个实施用户定义的业务规则的业务逻辑层(BLL),以及一个由共享页面布局的ASP.NET网页组成的表现层.在打下这个后端的基础工作之后,我们将开始转向报表,示范如何显示,汇总

在ASP.NET 2.0中操作数据之三:创建母版页和站点导航

导言 通常,用户友好的个性化站点都有着一致的,站点统一的页面布局和导航体系.Asp.net 2.0引入的两个新特性给我们在统一站点的页面布局和站点导航上提供了简单而有效的工具,它们是母板页和站点导航.母板页允许开发者创建统一的站点模板和指定的可编辑区域.这样,aspx页面只需要给模板页中指定的可编辑区域提供填充内容就可以了,所有在母板页中定义的其他标记将出现在所有使用了该母板页的aspx页面中.这种模式允许开发者可以统一的管理和定义站点的页面布局,因此可以容易的得到拥有统一的视觉和感觉的页面并且

ASP.NET 2.0 中收集的小功能点(转)

1.asp.net 2.0中的MaxPageStateFieldLength 属性 在asp.net 2.0中,可以强制对viewstate进行分段传输了,使用的是Page.MaxPageStateFieldLength 属性,可以设置viewstate中,每个页面状态字段的最大字节数.格式如下,要在WEB.CONFIG文件里设置的:<pages maxPageStateFieldLength="5" />其中,将设置把viewstate为不超过5字节,如果实际的views

在ASP.NET 2.0中操作数据之五十六:使用ObjectDataSource缓存数据

导言 就计算机科学而言,caching就是将所需要的数据或信息的备份放在某个地方,便于快速访问的这样一个过程.以数据处理(data-driven)程序为例,程序的大部分时间浪费在数据查询上.要提升这种程序的性能,通常的做法是将查询结果存放在程序的存储器里. ASP.NET 2.0提供了各种各样的缓存方式.对web页面和用户控件可以通过output caching进行缓存:同样我们可以通过ObjectDataSource 和SqlDataSource控件,在控件级(control level)对数

ASP.NET 2.0中预设的cookie

今早在老外的BLOG上看到这个说法,不妨留意一下: 如果你在asp.net 2.0中使用FormsAuthentication,并且将cookie设置为持久状态,那么其持续时间默认是30分钟的,而不是asp.net 1.1中的50年,因为50年的话太不安全了,你的计算机会被人卖掉的.如果要更改的话,可以使用timeout属性更改 <authentication mode="forms"> <form loginUrl="login.aspx" ti

在ASP.NET 2.0中操作数据之三十五:使用Repeater和DataList单页面实现主/从报表

导言 在前面一章里我们学习了如何用两个页分别显示主/从信息.在"主"页里我们用Repeater来显示category.每个category的name都是一个链到"从"页的hyperlink.在从页里用一个两列的DataList显示选中的category下的product.本章我们将还是使用单页,在左边显示category列表,category的名字用LinkButton显示.点击其中一个时页面postback,在右边以两列的DataList显示出相关的product

在ASP.NET 2.0中操作数据之十八:在ASP.NET页面中处理BLL/DAL层的异常

导言 在一个使用了分层体系架构的ASP.NET web应用系统里处理数据,一般遵循以下几步: 1.确定业务逻辑层需要调用哪个方法,并且需要出入哪些参数.这些参数可以通过硬编码设置,程序自动设定,或者由用户输入. 2.调用此方法. 3.处理结果.当调用一个返回数据的BLL方法时,这包括绑定数据到Data Web服务器控件.而对于修改数据的BLL方法而言,这包括基于返回值的基础上执行某些动作,或者适当地处理在第二步中引发的异常. 正如我们在前一节里看到的,无论ObjectDataSource控件还是