WebForm.aspx缓存(Cache)

110 篇文章 2 订阅
缓存(Cache)
1,如果每次进入页面的时候都查询数据库而生成页面内容的话,如果访问量非常大
则网站性能会非常差,如果只有第一次访问的时候才查询数据库而生成页面内容。以后都直接输出内容。则能提高系统的性能。这样无论有多少人访问都只访问一次数据库。所以数据库的压力不变(即:即便再多人访问页面,也不会对数据库造成压力)

缓存是一中利用空间换取时间的技术,存在与计算机中的很多地方,用来将一些慢速设备中的常用数据保存在快速设备中,取数据的时候直接冲快速设备中取。比如Cpu的二级缓存,windows文件读取缓存

缓存存在失效的问题。为了保证从缓存中读取数据和慢速设备中数据一致,则需要在慢速设备中数据发生变化的时候,清除缓存中相应的数据。

缓存是改进网站性能的第一手段,就像索引是改进数据库性能的第一个手段一样。asp.net缓存主要分为:页面缓存,数据源缓存,数据缓存这三种主要的类型

//-------------------------------------------------------------------页面缓存

页面缓存:
给页面添加<%@ OutputCache Duration="15" VaryByParam="none"%>标签就可以启用页面缓存,这样整个页面的内容都会被缓存。页面中的Asp.net代码,数据源在缓存期间都不会被运行,而是直接输出缓存的页面内容。Duration表示缓存时间,一秒为单位。超过这个事件则缓存失效,再次生成以后会在缓存15秒,以此类推。而
注:如果看缓存的效果的话,可以在Page_Load处设置断点,然后修改数据库数据,启动调试,看你缓存后,你在15秒内你刷新页面,看Page_Load会不会被执行,和你修改数据库数据后,你刷新页面数据会不会更新。答案是:在缓存的15秒内,再次刷新页面Page_Load不会不执行。既然代码都没被执行,所以你修改数据库数据后,刷新页面后的数据也不会更新。所以你15秒前开始缓存,15内,不管多少用户访问,和刷新页面看到的内容都是一样的。

缓存是针对所有这个页面的访问者的(session也是储存在服务器端的,但是session是针对个人的,它是根据客户端保存的sessionId去服务器端取数据)。这样1个访问者和1万个访问者,一次访问和100w万次访问数对数据库的压力是一样的

<a target=_blank href="http://locahost:2619/viewNews.aspx?id=1">http://locahost:2619/viewNews.aspx?id=1</a>
对于看新闻页面来讲,如果如上设置的话,它缓存的是第一个页面,也就是(即缓存的是http://locahost:2619/viewNews.aspx?id=1),它不会考虑http://locahost:2619/viewNews.aspx?id=1与http://locahost:2619/viewNews.aspx?id=2有什么不同。因为 ?id=2,?id=3只是页面的不同参数而已,为了能让不同的新闻各自缓存,因此可以设置VaryByParam="id",
即:<%@ OutputCache Duration="15" VaryByParam="id"%>表示对于不同的id参数进行单独缓存,如果有多个确定缓存的参数,则将参数名用分号隔开即可。比如:VaryByParam="id;number"。

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

在WebUserControl中页可以像页面缓存一样设置控件的缓存。

页面缓存的作用:假设我在页面中添加了这么一段代码<%@ OutputCache Duration="15" VaryByParam="none"%>
那么当第一个客户来访问我的页面的时候,我就将整个页面缓存了。那么在15秒之内,所有客户缓存我这个页面的时候都是直接读取我缓存里面的数据(即缓存的页面)它并没有调用我的Page_Load代码。(所以说,这15秒内所有的客户看的内容都是一样的,当过了15后,这个缓存失效了。它又执行一次Page_Load,然后重新开始缓存)

<%@ OutputCache Duration="15" VaryByParam="none"%>中的VaryByParam="none"表示不考虑参数,只要是这个页面我就给你缓存15秒。
<%@ OutputCache Duration="15" VaryByParam="id"%>,表示考虑参数,根据参数的不同id来缓存。即:一个网站(http://locahost:2619/viewNews.aspx)可以很多个页面(http://locahost:2619/viewNews.aspx?id=1) 比如第一个页面的id是1,第二个页面的id是2,那么我就会根据页面id的不同来缓存。即每个页面都有缓存


//-------------------------------------------------------------------数据源缓存

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"></asp:ObjectDataSource> :注:ObjectDataSource是webForm.aspx中的一个控件。在工具箱,数据里可以拖进页面
数据源缓存:
设定ObjectDataSource的CacheDuration(缓存时间:秒),EnableCaching=true。这样每隔CacheDuration指定的时间段才会调用SelectMethod指定的方法来执行数据库的查询。其他时候都是直接返回缓存的数据。
注:CacheDuration的默认值为Infinite 即无限期,可以给它设为你要的缓存时间,例如CacheDuration="15" 即:<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"  CacheDuration="15">

缓存固定的时间适用于首页,文章列表等访问频繁的页面。对于看帖页面则不适合。假设有100万个帖子,如果每个帖子都是固定缓存1个小时的话,假设一个小时之内10万个帖子被看了,那么就要缓存10万个帖子,非常占用内存。因为“百年一年的”的帖子偶然被访问一次也缓存一个小时,非常占用内存。这时候可以采用“滑动窗口”策略,比如:帖子缓存10分钟,如果10分钟之内又访问了,则缓存的失效时间修改为从被访问这一刻起的10分钟之后。以此类推。这样经常访问的忒子就可以“长期缓存”,而不经常访问的帖子也不会因为偶然访问而长期占用缓存。
设置方法,数据源:CacheExpirationPolicy="Sliding"

具体测试代码如下

新建一个WebForm空应用程序,里面添加一个WebForm.aspx页面文件

WebForm.aspx页面

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebFrom.WebForm1" %>
<%@ OutputCache Duration="500" VaryByParam="id;name"%>
<!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">
    <div>
    
    </div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    </form>
</body>
</html>

WebForm.aspx.cs文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebFrom
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Label1.Text = DateTime.Now.ToString(); 
        }
    }
}




  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值