缓存介绍

如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,则网站性能会非常差,
而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出内容,则能提高系统性能,
这样无论多少人访问都只访问一次数据库,数据库压力不变
缓存是一种用空间换取时间的技术,存在于计算机中很多地方,用来将一些慢速设备中的常用数据保存
在快速设备中,取数据的时候直接从快速设备中取,比如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的更多相关文章

  1. asp.net,缓存Cache

    缓存Cache: >直接使用Cache["content"],缓存与Session不同,所有用户都可以共享.永不过期,由服务器自己维护,当内存不够时,会将老的缓存释放掉. & ...

  2. ASP.NET 缓存(Cache)

    ASP.NET提供了在一个ASP.NET应用程序基本上缓存信息的编程功能.该功能和Application对象相似,但它具有在ASP.NET应用程序的生命周期内动态维护缓存信息的能力.在应用程序中缓存数 ...

  3. ASP.NET缓存 Cache之数据缓存

    添加 Cache[Key]=object  or Cache.Insert 移除 Cache.Remove(key) 1.将值直接写入Cache 代码如下 复制代码 HttpContext.Curre ...

  4. ASP.NET状缓存Cache的应用-提高数据库读取速度

    原文:ASP.NET状缓存Cache的应用-提高数据库读取速度 一. Cache概述       既然缓存中的数据其实是来自数据库的,那么缓存中的数据如何和数据库进行同步呢?一般来说,缓存中应该存放改 ...

  5. ASP.NET缓存中Cache过期的三种策略

    原文:ASP.NET缓存中Cache过期的三种策略 我们在页面上添加三个按钮并双击按钮创建事件处理方法,三个按钮使用不同的过期策略添加ASP.NET缓存. <asp:Button ID=&quo ...

  6. ASP.NET -- WebForm -- 缓存Cache的使用

    ASP.NET -- WebForm --  缓存Cache的使用 把数据从数据库或文件中读取出来,放在内存中,后面的用户直接从内存中取数据,速度快.适用于经常被查询.但不经常变动的数据. 1. Te ...

  7. [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能

    [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...

  8. 缓存Cache

    转载自  博客futan 这篇文章将全面介绍有关 缓存 ( 互动百科 | 维基百科 )cache以及利用PHP写缓存caching的技术. 什么是缓存Cache? 为什么人们要使用它? 缓存 Cach ...

  9. ASP.NET 缓存技术分析

    缓存功能是大型网站设计一个很重要的部分.由数据库驱动的Web应用程序,如果需要改善其性能,最好的方法是使用缓存功能.可能的情况下尽量使用缓存,从内存中返回数据的速度始终比去数据库查的速度快,因而可以大 ...

随机推荐

  1. iOS 检测网络切换

      CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center             ...

  2. Introduction to SignalR -摘自网络

    What is SignalR? ASP.NET SignalR is a library for ASP.NET developers that simplifies the process of ...

  3. .NET Compact Framework Data Provider for SQL Server CE

    .NET Compact Framework Data Provider for SQL Server Mobile Standard Data Source=MyData.sdf;Persist S ...

  4. PHP数组操作汇总

    php 操作数组 (合并,拆分,追加,查找,删除等) - Just Code - ITeye技术网站 PHP操作数组的一些函数介绍 -- 简明现代魔法 PHP数组元素操作实例 -- 简明现代魔法 儿童 ...

  5. void,extern,sizeof

    高手潜规则:禁用goto 程序质量与goto出现次数成反比 void指针的意义 1.C语言规定只有相同类型的指针才可以相互赋值 2.void*指针作为坐值用于"接收"任意类型的指针 ...

  6. ASP.NET MVC- Model- An Introduction to Entity Framework for Absolute Beginners

    Introduction This article introduces Entity Framework to absolute beginners. The article is meant fo ...

  7. iOS 静态库和动态库

    这两个东西都是编译好的二进制文件.就是用法不同而已.为什么要分为动态和静态两种库呢?先看下图:

  8. [转帖] 安装Eclipse插件长时间卡在 calculating requirements and dependencies

    把"Contact all update sites during install to find required software"前面的勾去掉,然后点击下一步,这样之后问题迎 ...

  9. creating normals from alpha/heightmap inside a shader

    http://www.polycount.com/forum/showthread.php?t=117185 I am making some custom terrain shaders with ...

  10. 一个不喜欢读书的Javaer的读书单

    很可惜,从我一开始学技术开始,我就不喜欢看书,严重的时候翻不到两页就会开始狂打瞌睡.很幸运,有互联网能够为我提供很多知识,甚至一些知识从网上看来的会更加权威一些.但是,我的经验告诉我,无论是从功利性的 ...