技术开发 频道

理解缓存

IT168 技术文档】

    最近公司一直在招人,我作为主考官之一 。经常会提问的一个问题,就是让用户介绍自己在缓存方面的经验和心得。绝大多数的面试者只能说ASP.net的页面缓存和局部缓存,稍稍有点经验的,会提到企业库的缓存,只有很少的人会知道Memcached(一个分布式的缓存)。而对于缓存的一些基本思想,却没有一个人能说出来。

    现在的技术人员,很多时候,不管三七二十一,把一个个实体丢到缓存中,然后在用的时候,就从缓存中去找这个实体。而不会考虑缓存的其他方面因素。所以他们在提到缓存时,想到的才只能是一个个的缓存实现的方法,而不是缓存的思想。

    那么,肯定就有人问,蝈蝈俊,那你理解的缓存思想是如何的呢?下面我就一一来说出我理解的缓存。

    什么样的缓存才是好缓存?

    能解决问题的缓存就是好缓存。这句话简直就是废话,相当于白猫、黑猫,抓住老鼠的就是好猫。

    那在解决问题前提下,哪个缓存才是好缓存呢? 这个问题我的答案是:缓存命中率高的缓存是好缓存。

    在解决问题前提下,命中率高的缓存比命中率低的缓存,在硬件投入上可能会比较小,同时缓存的数量比命中率低的缓存数量也可能少,这样寻址的速度肯定比较快。所以命中率高的缓存是好缓存。

    缓存的命中率

   
一个缓存的实体在被丢到缓存中后,在这个实体被缓存的期间(这个实体被缓存的生命周期内),如果外部一次都没有使用过它,这个缓存实体的命中率就是0。这个实体被请求的次数越多,它的缓存命中率越高。

    上面说的是缓存中一个实体的命中率。对于缓存整体来说,它的命中率则是上面各个被缓存的个体的命中率分布图。

    对于缓存来说:通常最常使用的个体之占总体的很小一部分。最不常使用的占整体的很大一部分。如下图所示:


    所以我们经常会看到类似这样的数据:

    缓存的1万个元素中,有100个被频繁的使用,几乎每分钟都会被使用一次。2000个数据,每小时被请求一次。3000个数据,每天被请求一次,剩下的数据,被丢到缓存中后一次都没有被使用过。

    现在硬件发展很快,如果我们只是需要缓存1万个数据的话,我们完全可以做到不管这1万个数据是否被使用到,全部丢到缓存,这样只要找数据,肯定缓存中有这个数据。而不需要作额外的运算,或者不需要向数据库发出请求。

    但是:硬件发展快,数据量发展也快。小型的网站,缓存1万条数据,也就全部缓存了。但是大型网站最少也是上百万的数据量或者上T级别的数据,这些数据量显然不能都丢到缓存。这时候设计一个合理的缓存方案,提高缓存的命中率,就非常重要。而且是必须的。

    提高缓存命中率的一些常见方法

   
纯技术的角度来说,我们只有记录了用户的单位时间的请求数,并依照这个信息来把最常被使用的数据缓存起来。

    但更多的时候,我们是根据业务逻辑来提高缓存命中率的。比如:去年,前年发表的博客,这类文章的浏览请求,一般一天至少可怜的几次。一般不应该缓存到内存中。

    又比如,回复数多的帖子,一般被请求数会比回复数少的帖子会被更多人次看到。 

    我们应该通过上面逻辑,根据我们实际业务逻辑,提供一个缓存算法,提高缓存的命中率。让在我们硬件允许的条件下,缓存适当的数据,而不是所有数据。

    一个反面的例子就是:不管三七二十一,一个大型的博客站点,一篇文章被用户请求的时候,发现不在内存缓存中,就从数据库中读出,然后丢到缓存。

    要知道,现在爬虫程序很多的。另外,博客这类搜索引擎友好的站点,决大多数的访问压力是搜索引擎搜索过来的。而这些访问一般都是1小时,或者1天之内,对某篇文章只有几次甚至1次请求,之后再也没有了。上面作缓存的方法,命中率会非常低的。

    这里也许就有人会问,郭红俊,既然你不建议我缓存这些博客的内容,但是我如何提高我站点的性能呀,我至少得保证我博客站点不会速度慢的无法响应用户请求呀。

    这个问题的解决方案有很多,一个最简单的方法就是把这些博客做成静态Html页面,也就是文件系统的缓存,文件系统因为硬盘的原因,可以简单理解成可以无限扩容,这样就可以把很多命中率低的内容进行缓存。

    如果你的页面需要一些动态逻辑判断,你可以把数据缓存成XML文件,然后服务器段整合这些XML文件,或者是包含文件。这也是种不错的方法。

    说了这么多缓存命中率的问题,简单汇总一下缓存命中率的观点:

    1.小型网站可以全部数据缓存,一般压力也不会很大,可以忽略缓存命中率问题。
    2.大型服务无法全部数据缓存,只能部分数据缓存,这时候就需要架构师设计出对该业务逻辑适用的缓存方法,尽可能的提高缓存的命中率。
    3.提高命中率的方法大多是跟业务逻辑捆绑的,需要跟具体问题具体分析
    4.对于不能被内存缓存的数据,最简单的提高性能方法就是使用文件缓存。
    5.文件缓存可以整个内容缓存成一个静态文件;也可以是整个页面的一个区域被缓存成一个文件,然后被包含;也可以是把一个实体序列化成XML文件进行缓存。

0
相关文章