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等等,对于缓存的理解知识刚刚开始,随着以后的学习会不断的深入,希望在以后的学习中继续深入,这只是自己的初步理解。