ASP.NET缓存 Cache
如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,则网站性能会非常差,
而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出内容,则能提高系统性能,
这样无论多少人访问都只访问一次数据库,数据库压力不变
缓存是一种用空间换取时间的技术,存在于计算机中很多地方,用来将一些慢速设备中的常用数据保存
在快速设备中,取数据的时候直接从快速设备中取,比如CPU二级缓存,WINDOWS文件读取缓存
缓存存在失效的问题:为了保证从缓存中读取数据和慢速数据中数据一致,则需要在慢速数据中对应
的数据发生变化的时候,清除缓存中相应的数据
缓存是改进网站性能的第一个手段,就像索引是改进数据库性能的第一个手段一样
ASP.NET缓存主要分为:
页面缓存,
数据源缓存,
数据缓存
1.页面缓存
给页面添加 <%@OutputCache Duration="15" VaryByParam="none"%> 标签就可以启用页面缓存,
这样整个页面的内容都会被缓存,页面中的ASP.NET代码,数据源在缓存期间都不会运行,而是直接
输出缓存的页面内容,Duration 表示缓存时候,以秒为单位,超过这个时间则缓存失效,再次生成以
后会再缓存15秒,以些类推,在在Page_Load处设置断点,修改数据库可测试
缓存是存在服务器,不是客户端,因为用HttpWatch还是能看到向服务器提交请求
缓存是针对所有这个页面的访问者,这样1个访问者和 1万个访问者,一次访问和100万次访问对数据
的压力是一样的
对于看新闻页面来讲,如果如上设置的话,则会缓存在第一个看到的新闻,因为?id=2,?id=3只是页面
的不两只参数而已,为了能让不同的新闻各自缓存,因此可以设置VaryByParam="id",表示对于不同的
id参数进行单独缓存,如果有多个确定缓存的参数,则将参数名用 分号; 隔开即可,比如VaryByParam="id;num"
如果想让任何不同的查询字符串都创建不同的缓存,则设置VaryByParam="*",一般情况下设置*就足够
在WebUserControl中也可以像页面缓存一样设置控件的缓存
2.数据源缓存
设定ObjectDataSource的CacheDuration (缓存时间:秒),EnableCaching=true
这样每隔CacheDuration指定的时间段才调用SelectMethod指定的方法来执行数据库查询,
其他时候都是直接返回缓存的数据。
缓存固定的时间适用于首页、文章列表等访问频繁的页面,对于看贴页面则不适合,假设有100万个
帖子,如果每个帖子都是固定缓存1小时的话,假设一小时之内有10万个帖子被看了,那么就要缓存
十万个帖子,非常占用内存,因为“百年一看”的“坟帖”偶然被访问一次也缓存一个小时,占用内存
这时候可以采用“滑动窗口(sliding)”策略,比如帖子缓存10分钟,如果10分钟之内又访问了,则
缓存的失效时间修改为从被访问这一刻起的10分钟之后,以此类推。这样经常访问的帖子就可以“长
期缓存”,而不经常访问的帖子也不会因为偶然访问而长期占用缓存。设置方法,
数据源:CacheExpirationPolicy="Sliding"
貌似滑动有问题。不是问题,Sliding只是策略,服务器会参考
3.缓存其他 (自定义缓存)
页面缓存、数据源缓存等内部都是使用HttpRuntime.Cache来实现缓存的,在一些页面缓存、数据源
缓存完成不了的特殊的缓存要求中,可以直接调用HttpRuntime.Cache进行缓存。在如鹏网项目中会讲到
(*)ASP.Net缓存默认是保存在内存中的,还可以配置保存到数据库中,大型网站还会配合使用Memcached等技术
清除缓存。在缓存还未失效的时候可能需要立即清空缓存,让数据库的修改立即反映到界面中
ASP.Net没有提供现成的方法,可以使用Hack级别的代码
// 保存缓存 null 表示缓存依赖
// 键,值,缓存依赖对象,绝对过期时间,区间
Cache.Insert("user","xgao",null,DateTime.Now.AddSeconds(),TimeSpan.Zero); // 简单保存缓存
Cache["test"] = "这是一个测试!"; //读取缓存
lbl.text = Cache["user"];
原理:它是依赖指定的文件,一但文件被删除,修改,缓存将也会被删除
依赖于文件内容 CacheDependency cDep = new CacheDependency(filePath);
实例如下: 实现当文件内容不变的时候,就读缓存的,内容一变就更新缓存
protected void Page_Load(object sender, EventArgs e)
{ if (Cache["fileText"] == null)
{
Response.Write("文件被修改,缓存被删除,但又创建了新的缓存,下次访问可得到!");
// 得到指定文件的物理路径
string filePath = Server.MapPath("~/CacheDep.txt");
// 读取指定文件
string Text = File.ReadAllText(filePath); // 创建缓存的文件依赖对象(依赖的文件的服务物理路径)
CacheDependency cDep = new CacheDependency(filePath);
// 键,值,缓存依赖对象,无绝对过期时间,无滑动过期时间,优先级,更新回调函数
Cache.Insert("fileText", Text, cDep,
System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.Normal, callback);
}
else
{
Response.Write(Cache["fileText"].ToString());
}
} // 缓存依赖的回调函数(当缓存被清除时调用些方法)
public void callback(string key, object value, CacheItemRemovedReason reason)
{
string filePath = Server.MapPath("~/CacheLog.txt");
string msg = "Cache["+key+"]="+value+"缓存被移除,因为:"+reason+"\r\n";
File.AppendAllText(filePath, msg);
}
依赖于数据库内容(轮询机制/通知机制)
轮询机制: 是FW不定期的去检查数据库
1.在数据库新建版本表(ID、Ver 字段 用来保存某张表的版本)
2.在数据库新建触发器(比如在新闻表上新建)
3.使用C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727中的aspnet_regsql.exe:
注册:aspnet_regsql -S . -E -ed -d 数据库名 -et -t 版本表名
删除:aspnet_regsql -S . -E -d 数据库名 -dt -t 版本表名
取消数据库缓存依赖: aspnet_regsql -S . -E -dd 数据库名 版本表名
列出已注册表:aspnet_regsql -S . -E -d 数据库名 –lt
4.配置web.config
5.数据库依赖对象
SqlCacheDependency cDep = new SqlCacheDependency("DepName", "BankVer");
aspnet_regsql -S(服务器) . -E(集成登陆)/-U sa -P 123 -ed(启动/-dd关闭) -d(数据库名) GSSMS -et(指定缓存依赖的表名/-dt禁用表名) -t(表名) Aticle
数据库依赖 实例:
1>. 表bank如下:
------------------------
ID Name Maney
------------------------
1 xgao 1000
2 zsan 1
3 lshi 2000
------------------------
表BankVer如下:
--------------
ID VerNum
--------------
1 0
--------------
2>. 在bank表里创建触发器:
create Trigger [bankTri]
on [bank]
for insert,update,delete
as
update BankVer set VerNum=VerNum+1
3>. 开启数据库的缓存依赖(CMD下运行):
aspnet_regsql -S . -E -ed -d TestData -et -t BankVer
4>. 在网站的 web.config配置在 <system.web> 下:
<caching>
<sqlCacheDependency enabled="true">
<databases>
<!-- pollTime为轮询时间间隔 15 秒 -->
<add name="DepName" connectionStringName="conStr" pollTime="15000"/>
</databases>
</sqlCacheDependency>
</caching>
5>. 前台代码:
<form id="form1" runat="server">
<div>
<asp:GridView ID="gvBankList" runat="server"></asp:GridView>
</div>
</form>
6>. 后台代码:
protected void Page_Load(object sender, EventArgs e)
{
if (Cache["bankList"] == null)
{
Response.Write("数据以更改!以下从数据库读取的!</br>"); DataTable dt = GetBankList();
gvBankList.DataSource = dt;
gvBankList.DataBind(); SqlCacheDependency sqlDep = new SqlCacheDependency("DepName", "BankVer");
Cache.Insert("bankList", dt, sqlDep, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.Normal,callback); }
else
{
Response.Write("以下是从缓存里读取的</br>");
gvBankList.DataSource = Cache["bankList"];
gvBankList.DataBind();
}
}
public void callback(string key,object value,CacheItemRemovedReason reason)
{
string filePath = Server.MapPath("~/CacheLog.txt");
string msg = "数据库依赖 Cache[" + key + "]=" + value + "缓存被移除,因为:" + reason + "\r\n";
File.AppendAllText(filePath, msg);
} public DataTable GetBankList()
{
string connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;
SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * from bank"; DataSet ds = new DataSet();
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.Fill(ds);
return ds.Tables[];
}
所使用的通知机制:是数据通信FW
ASP.NET缓存 Cache的更多相关文章
- asp.net,缓存Cache
缓存Cache: >直接使用Cache["content"],缓存与Session不同,所有用户都可以共享.永不过期,由服务器自己维护,当内存不够时,会将老的缓存释放掉. & ...
- ASP.NET 缓存(Cache)
ASP.NET提供了在一个ASP.NET应用程序基本上缓存信息的编程功能.该功能和Application对象相似,但它具有在ASP.NET应用程序的生命周期内动态维护缓存信息的能力.在应用程序中缓存数 ...
- ASP.NET缓存 Cache之数据缓存
添加 Cache[Key]=object or Cache.Insert 移除 Cache.Remove(key) 1.将值直接写入Cache 代码如下 复制代码 HttpContext.Curre ...
- ASP.NET状缓存Cache的应用-提高数据库读取速度
原文:ASP.NET状缓存Cache的应用-提高数据库读取速度 一. Cache概述 既然缓存中的数据其实是来自数据库的,那么缓存中的数据如何和数据库进行同步呢?一般来说,缓存中应该存放改 ...
- ASP.NET缓存中Cache过期的三种策略
原文:ASP.NET缓存中Cache过期的三种策略 我们在页面上添加三个按钮并双击按钮创建事件处理方法,三个按钮使用不同的过期策略添加ASP.NET缓存. <asp:Button ID=&quo ...
- ASP.NET -- WebForm -- 缓存Cache的使用
ASP.NET -- WebForm -- 缓存Cache的使用 把数据从数据库或文件中读取出来,放在内存中,后面的用户直接从内存中取数据,速度快.适用于经常被查询.但不经常变动的数据. 1. Te ...
- [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能
[.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...
- 缓存Cache
转载自 博客futan 这篇文章将全面介绍有关 缓存 ( 互动百科 | 维基百科 )cache以及利用PHP写缓存caching的技术. 什么是缓存Cache? 为什么人们要使用它? 缓存 Cach ...
- ASP.NET 缓存技术分析
缓存功能是大型网站设计一个很重要的部分.由数据库驱动的Web应用程序,如果需要改善其性能,最好的方法是使用缓存功能.可能的情况下尽量使用缓存,从内存中返回数据的速度始终比去数据库查的速度快,因而可以大 ...
随机推荐
- ios:Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set?
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)laun ...
- spring的有状态BEAN和无状态BEAN
有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”:一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束.即每个用户最初都会得到一 ...
- WinDbug抓取进程dump
安装WinDbug(包含在 Windows Kits-debugger 中)后,运行如下命令将会在 explorer.exe进程发生崩溃后抓取相应的内存数据到D盘根目录下的一个文件夹中 adplus. ...
- 使用ThinkPHP框架高速开发站点(多图)
使用ThinkPHP框架高速搭建站点 这一周一直忙于做实验室的站点,基本功能算是完毕了.比較有收获的是大概了解了ThinkPHP框架.写一些东西留作纪念吧.假设对于相同是Web方面新手的你有一丝丝帮助 ...
- MantisBT
官方网站:http://www.mantisbt.org/ MantisBT is a free popular web-based bugtracking system (feature list) ...
- jQuery动态实现title的修改 失效问题
最近做了一个网站,一切都很顺利,在上线的时候,突然发现一个严重的问题,开始面对这个问题,完全不知所措(在goole.火狐.IE9及其以上都没得问题:IE8及其低版本都失效)只是浏览器弹出一个bug,但 ...
- 加速Android Studio/Gradle构建
已经使用Android Studio进行开发超过一年,随着项目的增大,依赖库的增多,构建速度越来越慢,现在最慢要6分钟才能build一个release的安装包,在网上查找资料,发现可以通过一些配置可以 ...
- Java基础知识强化之IO流笔记44:IO流练习之 复制图片的 4 种方式案例
1. 复制图片的 4 种方式案例: 分析: 复制数据,如果我们知道用记事本打开并能够读懂,就用字符流,否则用字节流. 通过该原理,我们知道我们应该采用字节流. 而字节流有4种方式,所以做这个题目我们有 ...
- PHP第四章数组2
$str =array("dd"=>"d","dc"=>"ds","dd"=>&q ...
- android和javascript之间相互通信实例分析
1. AndroidManifest.xml中必须使用许可 "android.permission.INTERNET", 否则会出Web page not available错误 ...