『 天道酬勤 』 李天平的博客


君子之行,静以修身,俭以养德。非淡泊无以明志,非宁静无以致远。
posts - 127, comments - 2848, trackbacks - 83, articles - 18
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

系统缓存全解析

Posted on 2009-06-30 22:54 李天平 阅读(17765) 评论(21) 编辑 收藏

     有时候总听到网友说网站运行好慢,不知如何是好;有时候也总见到一些朋友写的网站功能看起来非常好,但访问性能却极其的差。没有“勤俭节约”的意识,势必会造成“铺张浪费”。如何应对这种情况,充分利用系统缓存则是首要之道。

     系统缓存有什么好处呢?举个简单的例子,你想通过网页查询某些数据,而这些数据并非实时变化,或者变化的时间是有期限的。例如查询一些历史数据。那么每个用户每次查的数据都是一样的。如果不设置缓存,ASP.NET也会根据每个用户的请求重复查询n次,这就增加了不必要的开销。所以,可能的情况下尽量使用缓存,从内存中返回数据的速度始终比去数据库查的速度快,因而可以大大提供应用程序的性能。毕竟现在内存非常便宜,用空间换取时间效率应该是非常划算的。尤其是对耗时比较长的、需要建立网络链接的数据库查询操作等。

缓存功能是大型网站设计一个很重要的部分。由数据库驱动的Web应用程序,如果需要改善其性能,最好的方法是使用缓存功能。

 

       系统缓存全解析文章索引

15.4.1      缓存的分类

     从分布上来看,我们可以概括为客户端缓存和服务器端缓存。如图15-1所示:

 

15-1  缓存的分类

 

客户端缓存—— 这点大家都有直观的印象。比如你去一个新的网站,第一次可能要花一阵子时间才能载入整个页面。而以后再去呢,时间就会大大的缩短,原因就在于这个客户端缓存。现在的浏览器都比较智能,它会在客户机器的硬盘上保留许多静态的文件,比如各种gif,jpeg文件等等。等以后再去的时候,它会尽量使用本地缓存里面的文件。只有服务器端的文件更新了,或是缓存里面的文件过期了,它才会再次从服务器端下载这些东西。很多时候是IE替我们做了这件事情。

 

服务器端缓存—— 有些东西没法或是不宜在客户端缓存,那么我们只好在服务器端想想办法了。服务器端缓存从性质上看,又可以分为两种。

(1)静态文件缓存

    好多页面是静态的,很少改动,那么这种文件最适于作静态缓存。现在的IIS 6.0这部分内容是直接存放在Kernel的内存中,由HTTP.SYS直接管理。由于它在Kernel Space,所以它的性能非常的高。用户的请求如果在缓存里面,那么HTTP.SYS直接将内容发送到network driver上去,不需要像以前那样从IISUser space的内存copyKernel中,然后再发送到TCP/IP stack上。Kernel level cache几乎是现在高性能Web server的一个必不可少的特性。

(2)动态缓存

     动态缓存是比较有难度的。因为你在缓存的时候要时刻注意一个问题,那就是缓存的内容是不是已经过时了。因为内容过时了可能会有很严重的后果。比如网上买卖股票的网站。你给别人提供的价格是过时的,那人家非砍了你不可。缓存如何发现自己是不是过时就是一个非常复杂的问题。

 

    在ASP.NET中,常见的动态缓存主要有以下几种手段:

  Ø  传统缓存方式

  Ø  页面输出缓存

  Ø  页面局部缓存。

  Ø  利用.NET提供的System.Web.Caching 缓存。

  Ø  缓存依赖。

 

15.4.2  传统缓存方式

比如将可重复利用的东西放到Application或是Session中去保存。

 Session["Style"] = val;
 Application["Count"] = 0;

 

 

选自《亮剑.NET:.NET深入体验与实战精要》15

Feedback

#1楼  回复 引用 查看   

2009-07-01 09:06 by 徐少侠      
是需要好好介绍

还是有很多人依然习惯于每个页面每次都连接数据库,查询,然后输出

要是今后能有一个简单易用的通用框架就好了

#2楼  回复 引用 查看   

2009-07-01 09:21 by 王金平      
--引用--------------------------------------------------
徐少侠: 是需要好好介绍

还是有很多人依然习惯于每个页面每次都连接数据库,查询,然后输出

要是今后能有一个简单易用的通用框架就好了
--------------------------------------------------------
严重同意

#3楼  回复 引用 查看   

2009-07-01 09:33 by 玉开      
看目录,这本书很值得看哟

#4楼  回复 引用   

2009-07-01 10:04 by Nico[未注册用户]
此书非买不可

#5楼  回复 引用   

2009-07-01 10:11 by 田[未注册用户]
@徐少侠

每个页面每次都连接数据库,查询,然后输入有什么问题啊?
本身SQL连接都是有连接池的,这种方式不见得不行吧??

#6楼  回复 引用 查看   

2009-07-01 10:18 by 徐少侠      
--引用--------------------------------------------------
田: @徐少侠

每个页面每次都连接数据库,查询,然后输入有什么问题啊?
本身SQL连接都是有连接池的,这种方式不见得不行吧??

--------------------------------------------------------
不仅仅是连接池的问题

呵呵,缓存,有时候甚至连输出结果都缓存了。

也就是说,相同请求时后台代码是根本不运行的。

再往下就是博主提到的那些东西了
在ASP.NET中,常见的动态缓存主要有以下几种手段:

Ø 传统缓存方式

Ø 页面输出缓存。

Ø 页面局部缓存。

Ø 利用.NET提供的System.Web.Caching 缓存。

Ø 缓存依赖。

等理解这些,以后估计就会少很多机会去讨论ASP.NET 还是JSP性能高,呵呵
因为大家都是缓存了,没啥好比的了。

#7楼  回复 引用 查看   

2009-07-01 10:33 by 田景      
@徐少侠
因为我总是看见众多的人抨击在页面的方法中打开连接- 查询- 关闭连接这种方法,弄的好似整个网站都只能是一个永远打开的连接一样。。。。然后在每个页面中都先取这个已经打开的连接来做查询。。。

我总觉得连接这东西就是应该在需要的时候打开,用完就关闭,这不就是在具体每个读取的地方打开,关闭吗?

至于页面内容等的缓存这个我到完全没有异议,我也是这么做的....

#8楼  回复 引用 查看   

2009-07-01 10:35 by 田景      
刚才偷懒没有登录,总觉得匿名讨论问题于心不安啦。。。

#9楼  回复 引用 查看   

2009-07-01 20:33 by Robin Zhang      
恭喜一下,新书出版。

#10楼  回复 引用 查看   

2009-07-02 09:46 by airwolf2026      
你给别人提供的价格是过时的,那人家非砍了你不可

哈哈.
有空拜读下大作哈.

#11楼  回复 引用 查看   

2009-07-02 09:47 by adpost      
发现LZ用的是思维导图

#12楼  回复 引用 查看   

2009-07-02 10:45 by 林思衣      
问下楼主
在memcached里 是否只能保存基本类型的数据啊 如何保存自定义类型的数据
比如
cache.set("custom",people);
还有他的安全机制用的是什么啊
谢谢

#13楼  回复 引用 查看   

2009-07-02 11:55 by 麦舒      
你图中的第三方缓存,应该是属于服务端缓存。

#14楼[楼主]  回复 引用 查看   

2009-07-02 13:28 by 李天平      
@林思衣 Memcached支持object类型保存的,你可以下载C#版本的客户端API看一下方法参数。

#15楼  回复 引用 查看   

2009-07-02 15:57 by 林思衣      
@李天平
还是不好使啊 我用c#的框架,
结果用 DistCache.Add("string","abc"); 就可以
用 DistCache.Add("class",people); 就添加不成功。
用另一个C#版本的客户端也是这样 请问是什么问题啊

再次 谢谢

#16楼  回复 引用 查看   

2009-07-03 10:10 by 林思衣      
@李天平
问题找到了
是要在类上加序列化标记 [Serializable]
我直接引用原来现成的类 所以添加不上去
还是表示感谢
一直在用您的dbhelp呢

#17楼  回复 引用 查看   

2009-12-14 10:45 by 戴超      
欢迎各位加入ASP.NET MVC框架超级群!让我们共同学习、进步!ASP.NET MVC一群:40985466人员已满!请其他有兴趣的朋友加ASP.NET MVC二群:14426077(同样可容纳500人的超级群!) 另群:49544745已作为PHP群使用!请慎重加入!欢迎大家的加入!
非常乐意为大家提供一个良好的交流平台!

#18楼  回复 引用 查看   

2010-03-24 18:07 by 彦斌      
请教一下楼主。
应用程序数据缓存
这个是保存在客户端的吗?

#19楼  回复 引用 查看   

2011-07-20 09:04 by 技术先锋      
并不是所有的WEB程序都需要缓存的,如果我搞个B/S的管理软件,弄个缓存,不要疯掉了。

#20楼  回复 引用 查看   

2011-07-20 09:05 by 技术先锋      
你应该可以设置,是否需要缓存

#21楼  回复 引用 查看   

2011-10-25 16:05 by 微光      
讲的确实不错,一直在找这样的文章,决定买您的书看看。