带你走进缓存世界(1):漫谈缓存

         什么是缓存?对于刚入门的朋友来说可能比较模糊,或是只知道是个提高性能的东东。我按我的理解说一下:缓存的目的就是为了提高性能,而把一些数据存放在内存里,方便程序反复使用,所以缓存就是放在内存里的那些数据。那么我们在开发程序时,比如定义了一个静态变量,这个静态变量的值一般都会被一直存放在内存里,这个变量就是缓存了。当然这个缓存的生命周期是第一次被调用直到程序结束。也并非说只有全局的静态变量才叫缓存。比如我们在一个httpRequest接收开始便声明了当前上下文(CurrentContext),那么在整个页面的生命周期里,我们都可以获得当前上下文,那么这个Context也是缓存。 假如我们把复杂数据查询结果放在一个数据表里,以供其他程序调用,那这个临时表就是缓存表,也是缓存。总之,缓存就是为提高性能而存在的。缓存,就是开辟了一些内空间来换取程序的运行时间。
         我们在开发的日常工作中,经常会碰到各种缓存,最常见的莫过于浏览器缓存,经常需要强刷新才能看到页面被修改的结果。这是浏览器的缓存策略,某些页面你刷新多次,如果你会使用firebug或ie9的网页开发工具(F12)或chrome自带的开发工具(Ctrl+Shift+c)或httpwatch的话,你可以观察network一项,来看所有的http请求的状况,如果被缓存的话,status就不是200,而是304(not modified),这样你的服务器就不会接收这个请求。一般静态资源(图片、js、css、html)都会被缓存起来。
         还有就是DataSet(ADO.NET里的类,非.NET程序员可能不清楚)。DataSet是ADO.NET相对于ADO的亮点之一。他亮就亮在不需要一直与数据库连接。他是先把数据读取出来放入DataTable里,然后由程序员针对DataTable做数据处理。这么做的目的就是不占用数据库连接,假如用户的每一条数据处理非常耗时,如果不用DataSet而用DataReader的话,那么如果访问量稍微大一些就会出现连接数过多的异常或者连接排队过多而导致超时的异常或者数据库非常紧张而导致所有查询都是慢查询的糟糕情况。所以这个DataSet也是缓存的概念,虽然可能仅仅是短短的一个方法的生命周期,但其思想没变。
         理解了缓存的意思,那么该如何使用缓存?我们先思考下什么样的数据可以缓存或需要缓存?一般来说是比较常用的数据,公共的数据需要缓存。常用是相对于程序说来,比如网站的配置信息,到处都需要调用,最好缓存起来。公共是相对浏览者来说,某个浏览者的私有信息是不适合放入缓存的,比如账户信息,这些一般用Session来存放。事实上,Session也是缓存,Session的值存放于服务端的内存里,而每个Session对应一个SessionID,SessionID的信息存放于客户端的cookie里。程序每次调用Session的值时,先要从浏览器发送的cookie里找到一个SessionID,然后再从内存里找对应该ID的Session值,所以来说Session也是缓存。但我说是公共数据是因为在我们未来讲到的所使用的缓存里,不适合存放相对用户的私有数据。

         从Cnblog的博客来说,相对于浏览者的公共信息,有博客的资料、侧边栏、文章、评论,除了浏览者自己的信息外,貌似都是公共信息。那都要缓存吗?那就是要看缓存的必要性。假如不是Cnblog,而是一个访问量不高的个人博客,如果把公共数据都缓存起来,难免有些自找麻烦的感觉。因为访问量不大,就是都缓存,这个性能的提升也是毫无意义的,而且从开发的角度来讲,增加了大量的工作(每增加、修改、删除都会牵扯到缓存的更新),但对于Cnblog来讲,如果不缓存,或许数据库早就支撑不住挂掉了。可见缓存也是把双刃剑,用的好坏全看项目的需求。

         今天就先开个引子,后面我会对博客的缓存架构进行分析,各种缓存技术和策略一一道来。喜欢的盆友们不要错过。
posted @ 2011-08-01 14:44  君之蘭  阅读(606)  评论(0编辑  收藏  举报