首页 > 代码库 > ASP.NET——缓存(cache)

ASP.NET——缓存(cache)

  1.      基础

    ?  定义

    缓存(cache)是一种用空间换取时间的技术,存在于计算机的很多地方,用来将一些慢速设备中的常用数据保存在快速设备中,取数据的时候直接从快速设备中取,比如cpu二级缓存、内存以及window文件读取缓存。

    ?  特点

    如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,那么网站性能会非常差。而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出内容,则能提高系统的性能,这样无论有多少人访问,都只是访问一次数据库:数据库压力不变。

缓存存在失效问题,为了保证从缓存中读取数据和慢速数据(数据库)中数据一致,需要在慢速数据(数据库)中对应的数据发生变化的时候,清楚缓存中相应的数据(缓存依赖)。

    ?  分类

    缓存是改进网站性能的第一手段,就像索引是改进数据库性能的第一个手段一样,asp.net的缓存主要分为三类:页面缓存(中庸)、数据源缓存(最不灵活)、数据缓存(灵活)。

 

  2.      应用

    ?  框架

技术分享

    注解:左侧是浏览器,右边是服务器,浏览器向服务器请求一个页面,比如说列表页面List.aspx,列表页面调用业务层,业务层调用数据层,访问数据库的方式来读取数据,之后将生成的数据返回,生成html代码后返回给浏览器,这样就是创建业务层,并且和数据层打交道,和数据库打交道是最耗费时间的,数据库和数据库文件打交道,一级比一级耗费时间和占用资源。为了解决这个问题,我们可将返回的生成html的数据存入缓存,下次再次访问的时候直接到缓存中找,这样大大提高了访问效率。

  3.      举例演示

    ?  演示有无缓存的区别

<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace cache
{
    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;
                //为缓存设置失效时间
                //下面的参数依次对应设计缓存过期时间的键、值、缓存依赖项、绝对过期时间、滑动过期时间(最后一次时间为主)
                Cache.Insert("date", datastr, null, DateTime.Now.AddSeconds(20), System.Web.Caching.Cache.NoSlidingExpiration);
                Response.Write("第二个输出时间为:" + Cache["date"] + "这里读取的当前的时间");   //这里读取的当前的时间,刷新页面时,这里的时间会随着变化。
            }
            else
            {
                Response.Write(Cache["date"] + "这里是从缓存中读取的时间");//这里读取的缓存中的时间,刷新页面时,这里的随着时间变化,不会变化。
            }
        }
    }
}</strong></span>

    ?  分类缓存—页面缓存举例

    给页面添加<%@OutputCache Duration=“15” VaryByParam=“none”%>标签就可以启用页面缓存,这样整个页面的内容都会被缓存,页面的asp.net代码、数据源在缓存期间都不会被运行,而是直接输出缓存的页面内容。Duration表示缓存时间,以秒为单位,超过这个时间则会失效,再次生成以后会再次缓存15秒,以此类推,在page.load处设置断点,修改数据库数据测试,这个缓存是在服务器缓存的,不是在客户端,因为用httpwatch还是能够看到向服务器提交的请求的,只不过服务器看到缓存就没有再执行页面类,一般视频、新闻需要缓存。

    缓存是针对所有这个页面的访问者,这样1个访问者和一万个访问者、一次访问和100万次访问对数据库的压力是一样的。

对于页面缓存,我们需要加入指令集。指令集VaryByParam后写进参数即可,比如可以是按id,指令集为“<%@OutputCache Duration="30" VaryByParam="id" %>”,这样便会根据不同id设置不同的页面缓存,且各个页面只是因为参数不同而已,如果有多个确定缓存的参数,则将参数名用分号隔开即可,比如:VaryByParam="id;name"。缓存可能存在过期数据的问题,因此需要根据需求选用。

    当然如果想让任何不同的查询字符串都能创建不同的缓存,则设置VaryByParam="*",一般情况下设置“*”就足够了。

在WebUserControl中也可以像页面缓存一样设置控件的缓存。感兴趣的自己试试。
    前台:
<span style="font-family:Microsoft YaHei;font-size:14px;"><strong><%@ Page Language="C#" AutoEventWireup="true" CodeBehind="cache2.aspx.cs" Inherits="cache.cache2" %>
<%@ OutputCache Duration="30" VaryByParam="none" %>
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ListBox ID="ListBox1" runat="server"></asp:ListBox>
    </form>
</body>
</html></strong></span>
    后台:
<span style="font-family:Microsoft YaHei;font-size:14px;"><strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;

namespace cache
{
    public partial class cache2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
         
            SqlConnection con = DBcon.createcon();
            con.Open();
            SqlCommand cmd = new SqlCommand("select * from login", con);
            SqlDataReader sdr = cmd.ExecuteReader();
           
            ListBox1.DataSource = sdr;

            ListBox1.DataTextField = "userName";


            ListBox1.DataBind();
            //sdr.Close();
            //con.Close();
            Response.Write("直接从数据库取数据的时间:" + DateTime.Now.ToString());

        }
    }
}</strong></span>

    ?  数据源控件缓存

    添加对象数据源,详细步骤参考以下博客链接,因为我这里没有建立B层,故而这里不再做演示,自己可以去试试。http://blog.csdn.net/goodshot/article/details/6401551

    缓存的设置比之前简单,只要设定ObjectDataSource的CacheDuration(缓存时间:秒),EnableCaching=true。这样每隔CacheDuration指定的时间段才调用SelectMethod指定的方法来执行数据库查询,其他时候都是直接返回缓存的数据。取数据的过程缓存,在缓存期间,绑定控件向ObjectDataSource要数据,ObjectDataSource直接将缓存的数据返回给控件,不再去向TypeName指向的类要数据。

    工作流程图:

技术分享

    如果缓存中存在,那么直接将缓存中的数据返回给控件,否则执行相应类的查找,最后将数据返回。

    设置属性图:

技术分享

    这样使得页面对象刷新,但是数据源没有从数据库中读取。 

    同样可以在html面设置:
<span style="font-family:Microsoft YaHei;font-size:14px;"><strong><asp:ObjectDataSource ID="ObjectDataSource1" runat="server" EnableCaching="True" CacheDuration="10" CacheExpirationPolicy="Absolute"></asp:ObjectDataSource></strong></span>

  4.      小结

    缓存(cache)是一种用空间换取时间的技术,我们知道还有session和cookie等等,对于缓存的理解知识刚刚开始,随着以后的学习会不断的深入,希望在以后的学习中继续深入,这只是自己的初步理解。



ASP.NET——缓存(cache)