ASP.NET 缓存

原文

缓存

概念

缓存是一种用空间换取时间的技术,通俗点也就是说把你得到的数据存放在内存中一段时间,在这短时间内服务器不去读取数据库、或是真实的数据源,而是读取你存放在内存中的数据,这里你会疑惑怎么设置存放数据,能存放什么样子的数据,存放时间的设置,真实数据源数据改变服务器不就读取存在偏差?别急,下面慢慢会说到的。。

好处

缓存是网站性能优化不可缺少的一种数据处理机制,他能有效的缓解数据库压力,例如,网站每分钟的点击率为100万,如果不使用缓存的静态页面,这里也没有viewstate的情况下(viewstate会产生大量的字符串,对服务器交互数据是一种压力,所以一般页面是要禁用viewstate,采用缓存的),只能是用户点击一次该页面,这个页面就读取一次数据库,这样给数据库造成的压力可想而知,如果这里我们使用了缓存的话,设置缓存有效期为1分钟,则这一分钟只内,点击100万次跟点击一次是一样的,都是读取一次数据库,数据源是被缓存在内存中了。

分类

ASP.NET 中的缓存主要分为:页面缓存,数据源缓存,自定义数据缓存这三种主要类型。

数据缓存

数据缓存:将一些耗费时间的条目加入到一个对象缓存集合中,以键值的方式存储。我们可以通过使用 Cache.Insert()方法来设置缓存的过期,优先级,依赖项等。

    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //  Cache["date"]=要缓存的数据;   这里是自定义缓存的简单声明使用
            string datastr = DateTime.Now.ToLongTimeString();
            Response.Write("第一个输出时间:"+datastr+"</br>");  //这里读取的当前的时间,刷新页面时,这里的时间会随着变化。

            if (Cache["date"] == null) //判断是否存在value值为date的缓存是否存在
            {
                Cache["date"] = datastr;
                Response.Write("第二个输出时间为:"+Cache["date"] + "这里读取的当前的时间");   //这里读取的当前的时间,刷新页面时,这里的时间会随着变化。
            }
            else
            {
                Response.Write(Cache["date"] + "这里是从缓存中读取的时间");//这里读取的缓存中的时间,刷新页面时,这里的随着时间变化,不会变化。
            }
        }
    }

上面数据缓存由于没有设置缓存的过期时间,所以第一个输出时间为当前时间(刷新页面会变),第二个输出时间会一直为第一次存入缓存的时间(刷新页面不变)。

下面我们给数据缓存添加一些实用的参数(上代码)。

protected void Page_Load(object sender, EventArgs e)
{
    string ids="";
    Maticsoft.BLL.ScriptsBak bll = new Maticsoft.BLL.ScriptsBak();
    List<Maticsoft.Model.ScriptsBak> list = new List<Maticsoft.Model.ScriptsBak>();
    list = bll.GetAll();
    for (int i = 0; i < list.Count; i++)
    {
        ids += list[i].ScriptId.ToString()+"--";
    }
    ids = ids + "完";  //这里的ids为从数据库中读取表中的id值然后用--链接起来的一个字符串
    if (Cache["key"] == null)
    {
        Cache.Insert("key", ids, null, DateTime.Now.AddSeconds(40), System.Web.Caching.Cache.NoSlidingExpiration);  //这里给数据加缓存,设置缓存时间
        //"key"为缓存的键,ids为缓存起来的值,null为缓存依赖项,这里没有使用缓存依赖项,所以为null,下面会详细介绍缓存依赖项
        //null后面为缓存的时间为40秒
        //最后一个参数为设置时间的格式,ASP.NET允许你设置一个绝对过期时间或滑动过期时间,但不能同时使用,
        //我们这里设置的为绝对过期时间,也就是没刷新一次页面后缓存数据为40秒,40秒后会从数据库中重新获取。
        Response.Write("cache加载为---" + Cache["key"] + "</br>");
    }
    else
    {
        Response.Write("cache加载为---" + Cache["key"] + "</br>");
    }
    Response.Write("直接加载为---" + ids + "</br>");
}

页面缓存

protected void Page_Load(object sender, EventArgs e)
{
    string date = DateTime.Now.ToString();
    Response.Write(date);
}
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="cache.WebForm1" %>
<%@ OutputCache Duration="10" VaryByParam="none" %>
<!---添加上这一句代码意思是,添加此页面缓存十秒,这十秒之内,刷新页面将读缓存起来页面的值,不再执行Page_Load方法。
     Page_Load方法是每十秒执行一次-->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <div>

    </div>
</body>
</html>

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

这条指令标签为该页面添加缓存。

Duration

指定页面缓存时间为10秒。

VaryByParam

指定页面参数,也就是这样子的,打个比方,例如这样一个页面 http://www.cnblogs.com/knowledgesea/admin/EditPosts.aspx?postid=2536603&update=1,那么他的参数也就是 postid 和 update,如果这样的页面我们可以把指令标签写为<%@ OutputCache Duration="10" VaryByParam="postid;update" %> 参数与参数之间用分号隔开,这样子也就把每个单独的页面缓存起来了,他缓存的就是 postid=2536603&update=1 或者postid=1&update=2 等等不一样的参数页面全部缓存起来。这里可以使用一个简便的方法,就是<%@ OutputCache Duration="10" VaryByParam="*" %>,缓存起来所有当前的页面下参数不一样的页面。

ASP.NET不会再执行页面的生命周期和相关代码而是直接使用缓存的页面,简单点理解也就是我注释中介绍的。

控件缓存

有缓存属性的控件设置缓存

ObjectDataSource这样的数据源控件,可以在属性栏中找到相应的属性,进行设置,下面我列出个例子,设置启动缓存,缓存时间为10秒,时间类型为绝对时间。

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" EnableCaching="True" CacheDuration="10" CacheExpirationPolicy="Absolute"></asp:ObjectDataSource>

没有缓存属性的控件要加缓存

protected void Page_Load(object sender, EventArgs e)
{
    string date = DateTime.Now.ToString();
    TextBox1.Text = date;
}
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="cache.WebForm1" %>
<%@ OutputCache Duration="10" VaryByControl="TextBox1"%>
<!--VaryByControl的参数为要缓存的控件id-->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        </div>
    </form>
</body>
</html>

这里的 TextBox 控件就加了缓存,这里的缓存时间为10秒,也就是10秒内 ASP.NET 不会再执行页面的生命周期和相关代码而是直接使用缓存的页面。

缓存依赖

缓存依赖项使缓存依赖于其他资源,当依赖项更改时,缓存条目项将自动从缓存中移除。

缓存依赖项可以是应用程序的 Cache 中的文件、目录或与其他对象的键。如果文件或目录更改,缓存就会过期。

protected void Page_Load(object sender, EventArgs e)
        {
            string str = "";
            if (Cache["key"] == null)
            {
                str = System.IO.File.ReadAllText(Server.MapPath("TextFile1.txt")); //读取TextFile1.txt文件中的数据
                CacheDependency dp = new CacheDependency(Server.MapPath("TextFile1.txt"));//建立缓存依赖项dp
                Cache.Insert("key", str, dp);
                Response.Write(Cache["key"]);   //如果TextFile1.txt这个文件的内容不变就一直读取缓存中的数据,一旦TextFile1.txt文件中的数据改变里面重新读取TextFile1.txt文件中的数据
            }
            else
            {
                Response.Write(Cache["key"]);
            }

        }

配置文件中设置缓存

<system.web>
  <caching>
    <outputCacheSettings>
      <outputCacheProfiles>
        <addname="ProductItemCacheProfile" duration="60"/>
      </outputCacheProfiles>
    </outputCacheSettings>
  </caching>
</system.web>
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="cache.WebForm1" %>
<%@ OutputCache CacheProfile="ProductItemCacheProfile" VaryByParam="none" %>
<!--这里的CacheProfile参数与配置文件中的保持一至-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <div>

    </div>
</body>
</html>

这样就给页面添加了缓存为60秒的页面。

缓存的回调函数

protected void Page_Load(object sender, EventArgs e)
        {
            string str = "";
            if (Cache["key"] == null)
            {
                str = System.IO.File.ReadAllText(Server.MapPath("TextFile1.txt")); //读取TextFile1.txt文件中的数据
                CacheDependency dp = new CacheDependency(Server.MapPath("TextFile1.txt"));//建立缓存依赖项dp
                Cache.Insert("key", str, dp, DateTime.Now.AddSeconds(20), Cache.NoSlidingExpiration, CacheItemPriority.Low, CacheItemRemovedCallback);
                //CacheItemPriority这个参数为缓存的优先级他分好多种级别,为了防止缓存占满时系统自己删除缓存的优先顺序废除缓存的,后面的为回调函数的名称。
                Response.Write(Cache["key"]);   //如果TextFile1.txt这个文件的内容不变就一直读取缓存中的数据,一旦TextFile1.txt文件中的数据改变里面重新读取TextFile1.txt文件中的数据
            }
            else
            {
                Response.Write(Cache["key"]);
            }

        }
//这个为缓存移除时的回调函数,一定要保持与 Cache.Insert()方法中的最后一个参数名字一致。
            //这里使用了委托,你可以在 Cache.Insert()这个函数中转定义看到的,所以这里的格式就只能按我写的这种方法签名写。
        public void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason)
        {
            System.IO.File.WriteAllText(Server.MapPath("log.txt"),"缓存移除原因为:"+reason.ToString());
        }

例子中的回调函数写的是生成一个log.txt,文件记录每一次缓存移除的原因。

配置文件中的缓存设置

我们服务器有开启缓存功能,缓存功能可以减少您访问网站时网站在服务器里面的编译时间, 大大加快您网站的访问速度,如果您需要对您网站进行频繁更新的话,您可以考虑暂时将缓存时间减少,或者暂时关闭缓存。

请将下列代码放进web.config文件里面放在您网站的根目录;

1. 在web.config里面设置缩小缓存的时间,请在web.config里面用下面的定义:

<system.webServer>
  <caching>
    <profiles>
      <remove extension=".aspx" />
      <add extension=".aspx" policy="CacheForTimePeriod" kernelCachePolicy="DontCache" duration="00:00:01" varyByQueryString="*" />
    </profiles>
  </caching>
</system.webServer>

2. 如果要关闭某个页面的 caching 功能,请在 web.config 里面用下面的定义:

<configuration>
  <location path="showStockPrice.asp">
    <system.webServer>
      <caching>
        <profiles>
          <remove extension=".asp" />
          <add extension=".asp" policy="DontCache" kernelCachePolicy="DontCache"/>
        </profiles>
      </caching>
    </system.webServer>
  </location>
</configuration>

3. 如果要关闭整个程序的 caching 功能,请在web.config里面用下面的定义:

<configuration>
  <system.webServer>
    <caching>
      <profiles>
        <remove extension=".asp" />
        <add extension=".asp" policy="DontCache" kernelCachePolicy="DontCache"/>
      </profiles>
    </caching>
  </system.webServer>
</configuration>

4. 如果要关闭根目录某个或某几个文件夹的 caching 功能,请在 web.config 里面用下面的定义:

<configuration>
  <location path="~/folderA,~/folderB">
    <system.webServer>
      <caching>
        <profiles>
          <remove extension=".asp" />
          <add extension=".asp" policy="DontCache" kernelCachePolicy="DontCache"/>
        </profiles>
      </caching>
    </system.webServer>
  </location>
</configuration>
时间: 2024-10-06 19:39:15

ASP.NET 缓存的相关文章

我用ASP.NET缓存之SQL数据缓存依赖(SqlCacheDependency)

[名词解释] 缓存(Cache)依赖,大白话解释就是缓存是否更新依赖于其它Object.那么SqlCacheDependency指的就是Cache的数据更新依赖于SQL Server数据库表的变化( 行级别更改)或者SQL 查询结果的变化. 以前也总结过缓存的使用 页面输出缓存:我用ASP.NET缓存之OutputCache 数据缓存:我用ASP.NET缓存之数据缓存 但是对缓存依赖还是很模糊,前阵子有幸在项目中实际运用了此类.现在结合自己的实际以及和网上大牛的经验,给大家分享一下. [使用背景

ASP.NET缓存 Cache

缓存介绍 如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,则网站性能会非常差,而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出内容,则能提高系统性能,这样无论多少人访问都只访问一次数据库,数据库压力不变缓存是一种用空间换取时间的技术,存在于计算机中很多地方,用来将一些慢速设备中的常用数据保存在快速设备中,取数据的时候直接从快速设备中取,比如CPU二级缓存,WINDOWS文件读取缓存缓存存在失效的问题:为了保证从缓存中读取数据和慢速数据中数据一致,则需要在慢

充分利用ASP.NET缓存提高站点性能

[简介] ASP.NET提供三种主要形式的缓存:页面级输出缓存.用户控件级输出缓存(或称为片段缓存)和缓存API.输出缓存和片段缓存的优点是非常易于实现,在大多数情况下,使用这两种缓存就足够了.而缓存API则提供了额外的灵活性(实际上是相当大的灵活性),可用于在应用程序的每一层利用缓存.本文全面介绍了这三种缓存技术在系统各层中的应用. 在ASP.NET提供的许多特性中,缓存支持无疑是我最欣赏的特性,我这样说当然是有充分理由的.相比ASP.NET的所有其他特性,缓存对应用程序的性能具有最大的潜在影

ASP.NET缓存中Cache过期的三种策略

原文:ASP.NET缓存中Cache过期的三种策略 我们在页面上添加三个按钮并双击按钮创建事件处理方法,三个按钮使用不同的过期策略添加ASP.NET缓存. <asp:Button ID="btn_InsertNoExpirationCache" runat="server" Text="插入永不过期缓存"      OnClick="btn_InsertNoExpirationCache_Click" />   

(转)ASP.NET缓存概念及其应用浅析

ASP.NET缓存概念及其应用浅析 ASP.NET缓存是什么呢?ASP.NET缓存有什么样子的特点呢?本文就向你详细介绍ASP.NET缓存的相关情况. ASP.NET缓存概念是什么呢?通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能.例如,如果应用程序使用复杂的逻辑来处理大量数据,然后再将数据作为用户频繁访问的报表返回,避免在用户每次请求数据时重新创建报表可以提高效率.同样,如果应用程序包含一个处理复杂数据但不需要经常更新的页,则在每次请求时

[转]C#基础回顾:Asp.net 缓存

本文转自http://www.cnblogs.com/stg609/archive/2009/03/22/1418992.html 缓存的作用      你买电脑的时候,是否会在意CPU的二级缓存?是不是希望二级缓存能够大点?那你有没有想过你为什么会有这种想法?说到底,就是为了性能问题,如果缓存大点,那就意味着我们处理数据的响应速度会更快.这就好比我们查字典,如果有一个单词,你需要知道它的意思,你是不是需要翻开字典,查找目录,翻到指定的页,找到你要的单词,这才能得到该词的解释?可是不幸的是,你并

ASP.NET缓存策略经验谈

要提升ASP.NET应用程序的性能,最简单.最有效的方式就是使用内建的缓存引擎.虽然也能构建自己的缓存,但由于缓存引擎已提供了如此多的功能,所以完全不必如此麻烦.在很大程度上,ASP.NET开发者在Web应用程序中,能将缓存引擎的功能直接包装到自己的数据表示及访问类中.如本文所述,整个过程其实非常简单.ASP.NET的缓存引擎支持三种类型的缓存:整页输出缓存是在一个页被首次请求时,将整个页呈现好的HTML内容缓存下来.后续请求将直接取用缓存拷贝.部分缓存是指缓存一部分HTML内容,这类似一个We

[转]ASP NET 缓存相关介绍及汇总

Cache及(HttpRuntime.Cache与HttpContext.Current.Cache) 2008-12-01 09:31 by McJeremy&Fan, 11322 阅读, 0 评论, 收藏, 编辑 我们在.NET运用中经常用到缓存(Cache)对象.除了System.Web.Caching下的Cache外,我们还可以用到HttpContext.Current.Cache以及HttpRuntime.Cache那么,HttpContext.Current.Cache以及HttpR

ASP.NET 缓存技术分析

缓存功能是大型网站设计一个很重要的部分.由数据库驱动的Web应用程序,如果需要改善其性能,最好的方法是使用缓存功能.可能的情况下尽量使用缓 存,从内存中返回数据的速度始终比去数据库查的速度快,因而可以大大提供应用程序的性能.毕竟现在内存非常便宜,用空间换取时间效率应该是非常划算的.尤 其是对耗时比较长的.需要建立网络链接的数据库查询操作等. 对于web页面的缓存,WebForm与ASP.NET MVC有不同的语法.在WebForm中, <%@ OutputCache Duration="6

ASP.NET - 缓存(Cache)

页面缓存: 给页面添加<%@ OutPutCache Duration = “15” VaryByParam = “none” %> 这样就可以启用页面缓存了,那么在规定的时间内,页面之访问数据库一次. Duration设置的是缓存的时间,以秒为单位,超过这个时间将缓存失效,则再次连接数据库进行数据查询. 对于新闻页面来说的话,如果设置缓存的话,则会缓存在第一个看到的新闻,因为?id=2.?id=3只是页面的不同参数而已,为了能让不同的新闻各次缓存,一次可以设置VaryByParam = “i