.NET中的缓存
构建高性能的应用程序的非常重要一项就是使用缓存。使用缓存可以避免重新从读取服务器端读取数据,节省数据从客户端到服务器间往返的时间,同时也减轻了服务器数据存取的压力。如果客户端非常频繁地读取服务器上的数据,比如生成报表,并且服务器每次获取这些数据都经过复杂的处理逻辑,那么就可能非常有必要使用缓存。应用程序需要.NET2.0中提供了两种不同方式的缓存:页面输出缓存和应用程序数据缓存。
页面输出缓存
我们知道asp.net服务器控件每次生成数据都要经过一个复杂的生存周期过程,参见[服务器端控件页面生存周期]。使用页面输出缓存就是指内存中缓存asp.net页面的内容,这样每次需要这些内容都无需重新生成,取而代之的是从内存中直接读取,这样节省了asp.net页面控件生成这些内容的时间,从而大大地提高了应用程序的性能。如果客户访问的这些页面的内容不经常变化,这些页面的访问量较大,那么就非常适宜使用页面输出缓存。
我们可以设置两种不同类型的页面输出缓存:全局页面缓存和页面片断缓存。全局页面缓存是指将整个页面的内容都缓存在内存中供客户端调用。而页面片断缓存是指在内存中缓存部分页面的内容,而其他的部分是动态重新生成的。
页面片断缓存有一种较为特殊的情形是,除了页面的某一局部内容不进行缓存,其他整个页面是缓存起来的,这种情形叫做Post-Cache Substitution。比如,登陆后在页面某个部分显示用户名处,我们就有可能用到这种情形。
使用页面输出缓存
可以通过两种方式设置使用缓存。
通过web.config配置缓存如下:
<System.web>
<caching>
<outputCache enableOutputCache="true"
enableFragmentCache="true"
sendCacheControlHeader="true"
omitVaryStar="false">
</outputCache>
<caching>
</system.web>
在页面中配置使用缓存如下:
如何从缓存中读取数据
要从缓存中读取数据,需要先判断一下缓存的键值是否存在,因为缓存中存储的信息是不稳定的,可能它已经被ASP.NET移去。因此推荐采用如下方式读取缓存的内容:
string cachedString;
if (Cache["CacheItem"] != null)
{
cachedString = (string)Cache["CacheItem"];
}
else
{
Cache.Insert("CacheItem", "Hello, World."); // 设置缓存
cachedString = (string)Cache["CacheItem"]; // 读取缓存
}
将数据添加到缓存中
string str = "a";
1。通过指定其键和值将项添加到缓存中
Cache["txt"] = str;
2.通过使用 Insert(重载Insert方法)方法将项添加到缓存中
Cache.Insert("txt", str);
全局页面缓存
下面例子表示缓存时间10秒,就是说每隔10秒读取一次系统时间。
对VaryByParam参数的一点说明:
VaryByParam 属性功能十分强大,它允许用户控件作者指示 ASP.NET 在服务器上缓存/存储输出缓存区域的多个实例。例如,前一个用户控件的宿主页的下列 URL 缓存用户控件内容的单独实例。
http://localhost/mypage.aspx?categoryid=foo&selectedid=0
http://localhost/mypage.aspx?categoryid=foo&selectedid=1
用户控件内的逻辑因此能够根据提供的参数动态生成不同的内容(单独缓存)。
除了支持 VaryByParam 属性外,片段缓存还支持 VaryByControl 属性。VaryByParam 属性基于使用 POST 或 GET 发送的名称/值对改变缓存结果,而 VaryByControl 属性则通过用户控件中的控件改变缓存片段。例如:
<%@ OutputCache Duration="120" VaryByParam="none" VaryByControl="Category" %>
注意:与输出缓存页相似,即使不使用 VaryByParam,也要求显式使用它。
例如,下列指令指示 ASP.NET 输出缓存用户控件 120 秒,并使用“CategoryID”和“SelectedID”查询字符串或窗体发布参数改变缓存。
<%@ OutputCache Duration="120" VaryByParam="CategoryID;SelectedID"%>
示例代码:
<%@ Page Language="C#" %>
<%@ OutputCache Duration="10" VaryByParam="*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%Response.Write(System.DateTime.Now);%>
</div>
</form>
</body>
</html>
页面片断缓存
设置页面片断缓存可以采用<%@ Control Language="C#" ClassName="WebUserControl" %>
或者在类名前加特性[PartialCaching(3)]。
如:
<%@ Control Language="C#" ClassName="WebUserControl" %>
<%@ OutputCache Duration="10" VaryByParam="*"%>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
this.Label1.Text = System.DateTime.Now.ToString("hh:mm:ss");
this.timer.Style.Add("width", (DateTime.Now.Second * 4).ToString() + "px");
}
</script>
<div id = "timer" runat="server" style="">
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</div>
或,
[PartialCaching(3)]
public partial class WebUserControl3 : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
this.Label1.Text = System.DateTime.Now.ToString("hh:mm:ss");
this.timer.Style.Add("width", (DateTime.Now.Second * 4).ToString() + "px");
}
}
应用程序数据缓存
http://files.cnblogs.com/Ring1981/Cache.rar]:
1. 建立default.aspx页面
<%@ Page Trace="true" TraceMode="SortByCategory" Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!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>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="Flush Cache" OnClick="Button1_Click" />
<asp:DataGrid ID="dg1" runat="server"/>
</div>
</form>
</body>
</html>
2. 添加一个names.xml
<?xml version="1.0" encoding="utf-8" ?>
<people>
<person first="Scott" last="stafield"></person>
<person first="jim" last="Green"></person>
<person first="kate" last="Green"></person>
</people>
3.添加后台代码
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data;
using System.Web.Caching;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
DataSet ds = null;
ds = (DataSet)Cache["names"];
if (ds == null)
{
string path = @"c:\inetpub\wwwroot\Cache\names.xml";
ds = new DataSet();
ds.ReadXml(path);
CacheDependency cd = new CacheDependency(path);
Cache.Insert("names", ds, cd);
Trace.Warn("Names read from XML file");
}
else
{
Trace.Warn("Names read from cache");
}
dg1.DataSource = ds;
dg1.DataBind();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Cache.Remove("names");
Response.Redirect("default.aspx");
}
}
运行程序, 第一次运行时,DataGrid里的数据是从xml文件中读取的。 以后每次刷新,文件都是从缓存读取的。 我们可以从每次运行时间看到,每次读取xml文件花费时间大约0.001275s,而每次读取缓存花费时间大约0.000044。 可见读取缓存数据性能能够大大地改善。
Category |
Message |
From First(s) |
From Last(s) |
Names read from XML file |
0.00155997480126664 |
0.001275 |
|
Names read from cache |
0.000343619091253218 |
0.000044 |
使用数据库缓存:
待续...
参考文件:
MSDN 文档
Microsoft ASP.NET 入门教: http://chs.gotdotnet.com/quickstart/aspplus/doc/quickstart.aspx
Scott stafield先生的视频教程
添加禁查词案例:
添加缓存:
Cache["key"] = str;
读取缓存:
str = (StringBuilder)Cache["key"];
清除缓存:
Cache.Remove("key");
.NET中的缓存的更多相关文章
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
- 清除oracle中的缓存(具体细节未知, 慎用)
oracle中的缓存主要是指SGA中的:1.share pool2.database buffer cache清空命令如下:首先要登录到sqlplus命令下,输入如下命令即可:SQL> alte ...
- AngularJS中的缓存
欢迎大家指导与讨论 : ) 缓存篇 一个缓存就是一个组件,它可以透明地储存数据,以便以后可以更快地服务于请求.多次重复地获取资源可能会导致数据重复,消耗时间.因此缓存适用于变化性不大的一些数据,缓存能 ...
- 如何在 apache 中设置缓存有效时间
今天学习了下如何在 apache 中设置缓存时间,记之以备忘. 在 http 报文头中,与缓存时间有关的两个字段是 Expires 以及 Cache-Control 中的 max-age,Expire ...
- 谈谈MVC项目中的缓存功能设计的相关问题
本文收集一些关于项目中为什么需要使用缓存功能,以及怎么使用等,在实际开发中对缓存的设计的考虑 为什么需要讨论缓存呢? 缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源(例如数据 ...
- iOS中dyld缓存的实现原理是怎样的?
在iOS开发中,为了提升系统的安全性,很多系统库文件都被打包到一个缓存的文件当中即dyld缓存,那大家对dyld缓存了解多少呢?今天小编将和大家分享的就是一位iOS大神对dyld缓存的使用分析,一起来 ...
- angular中$cacheFactory缓存的使用
最近在学习使用angular,慢慢从jquery ui转型到用ng开发,发现了很多不同点,继续学习吧: 首先创建一个服务,以便在项目中的controller中引用,服务有几种存在形式,factory( ...
- 如何在 Linux 中清除缓存(Cache)
如何在 Linux 中清除缓存(Cache) 方法一: http://mp.weixin.qq.com/s?__biz=MjM5ODAzODgyMQ==&am ...
- 菜鸟-手把手教你把Acegi应用到实际项目中(7)-缓存用户信息
首先讲讲EhCache.在默认情况下,即在用户未提供自身配置文件ehcache.xml或ehcache-failsafe.xml时,EhCache会依据其自身Jar存档包含的ehcache-fails ...
- HTTP请求中浏览器缓存
本文导读:浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制.客户端缓存是否需要是可以在服务端代码上控制的.那就是响应头.响应头告诉缓存器不要保留缓存,缓存器就不会缓存相应内容:如果请求信息是需要 ...
随机推荐
- ZIP:ZipStream
ZipInputStream: ZipInputStream(InputStream in) :创建新的 ZIP 输入流. int read(byte[] b, int off, int len) : ...
- 个人永久性免费-Excel催化剂功能第36波-新增序列函数用于生成规律性的循环重复或间隔序列
啃过Excel函数的表哥表姐们,一定对函数的嵌套.数组公式等高级的应用有很深的体会,威力是大,但也烧死不少脑细胞,不少人就在这样的绕函数中光荣地牺牲了,走向从入门到放弃.Excel催化剂的创立,初衷就 ...
- Envoy 源码分析--LDS
Envoy 源码分析--LDS LDS 是 Envoy 用来自动获取 listener 的 API. Envoy 通过 API 可以增加.修改或删除 listener. 先来总结下 listener ...
- PowerBI Desktop中如何能实现点击按钮跳转到相应报表页
我看到过一个报表首页,它将其他报表业存为一种类似URL的方式,按住Ctrl点击鼠标右键即可跳到相应的报表业. 当时我理解成了是“分页报表”的功能实现的,弄明白后发现是由按钮+书签的方式是实现的. 实现 ...
- spark 源码分析之十一--Spark RPC剖析之TransportClient、TransportServer剖析
TransportClient类说明 先来看,官方文档给出的说明: Client for fetching consecutive chunks of a pre-negotiated stream. ...
- jsp数据交互(一).3
引入的文件如果是jsp则应定义为***.jspf文件,如果其他文件可定义为***.inc文件,即include file. jsp:include是既可以静态包含又可以动态包含,用jsp:includ ...
- Spring框架使用@Autowired自动装配引发的讨论
问题描述 有同事在开发新功能测试时,报了个错,大致就是,在使用 @Autowired 注入时,某个类有两个bean,一个叫a,一个叫b. 一般这种情况应该声明注入哪个bean,他没有声明,他不知道这个 ...
- Asp.Net MVC SingleServiceResolver类剖析
SingleServiceResolver一般用于类工厂创建和注入点接口留白.类工厂创建比如Controller控制依赖于此类的创建,注入点留白实质上是依赖注入所对外预留的接口. 以第二个特性为例. ...
- 腾讯位置服务API快速入门
前言 之前项目有个需求,在网页上显示微信发送过来的位置信息,该开始想用百度地图,后来发现腾讯地图相对简单一点 快速入门 申请Key https://lbs.qq.com/guides/startup. ...
- Django是如何防止注入攻击-XSS攻击-CSRF攻击
注入攻击-XSS攻击-CSRF攻击介绍请访问:https://www.cnblogs.com/hwnzy/p/11219475.html Django防止注入攻击 Django提供一个抽象的模型层来组 ...