网站缓存这个话题并不新颖,但是能否将它用好,可是一门学问,同一件工具在不同人的手中会做出不同的事情来。这里我来分享总结下我对于网站架构中缓存应用的一些看法和经验,大家有好的想法可以补充。
第一:缓存的一些基本概念。
1:缓存(CACHE)与缓冲(BUFFER)的区别,我认为缓存可以在某种程序上理解成一级缓存(Primary Cache),数据全局共享。缓冲则属于二级缓存,只对一部分对象共享数据,二级缓存在某种程序上主要是降低一级缓存组件的访问压力以及提高缓存的存取效率。
2:缓存的一些基本属性:命中率,表示缓存命中的次数/总的请求数,这是缓存设计的重要质量指标之一;缓存执行效率,例如GET,INSERT,DELETE等;容量,即缓存介质的容量最大值;成本,即开发成本,部署成本,软硬件成本。
3:缓存的问题,存储介质的选择往往左右缓存的设计,缓存在不命中时往往会使性能下降。
第二:网站中缓存的应用场景:
1:可以缓存整个页面的html,提高访问响应能力;
2:针对局部页面元素进行缓存;
3:对复杂数据的结果进行缓存,例如一个查询需要结合多个数据集,然后根据这些数据集进行相应的运算,即使每个子集查询有缓存,但还是需要额外的运算,这种情况可以考虑缓存计算后的结果。
4:对耗时的查询进行缓存,例如产品列表页的查询。
5:和上下文相关的用户数据,例如用户从订单埴写页进入到订单成功页,或者是从产品列表页点击详细产品进行预订时的订单填写页,此时这两个页面之间都需要传递大量的相关数值,我们可以把所有的数值封装在一个类中,然后通过缓存进行通信。
第三:影响缓存命中率的因素。
1:数据时实性,每个业务系统都对自己的数据有相应的要求,有些数据的实时性非常强,像每日的股票信息,这种情况如果设置了缓存,缓存的命中率会特别低。
2:缓存粒度问题,一般来说是缓存的跨度太大,即此时的KEY值包含的条件太多,会出现缓存命中率特别低的情况。
第四:提高缓存命中率的方法:
1:增大存储介质的容量;
2:对非常热点的数据进行捕捉,可以采用实时更新缓存的方式来平衡缓存与实时性的问题,例如可以单独开启一个后台服务来定时做更新缓存的工作。
3:调整缓存KEY值的算法,尽量保证缓存KEY的细粒度,KEY-VALUE就是很好的细粒度例子。
4:根据业务调整缓存的过期策略。
第五:如何实现缓存组件:
1:采用二级缓存架构,即在web server上设置二级缓存,这里的二级缓存即上面的提到的缓冲,只对具体的webserver进行数据共享,二级缓存可以考虑采用微软企业库的缓存组件来完成。由于一级缓存的实现往往都是单独的服务器,为了减少缓存服务器的压力,在webserver上对数据进行缓冲,在降低缓存服务器压力的情况下最大的好处在于缓存的存取速度上。
2:一级缓存由单独的缓存服务器来完成,至于缓存服务器采用哪种缓存方案,可以根据不同的场景来决定。如果考虑到部署的方便性,可以采用微软企业库来完成一级缓存,如果服务器允许,可以采用memcached来实现。
cache服务器采用微软企业库实现的优缺点:
1:优点,开发以及部署都非常容易,不需要安装第三方软件等等;
2:缺点,需要自己开发客户端功能以实现分布式,这里我们可以采用一致性hash算法来实现,同时如果服务以WCF形式公布开,在访问效率上也不是最优的,比起memcached的通信方式要差一些。
memcached的优缺点:
1:优点,通信方式比起wcf要高;
2:缺点,需要第三方服务的支持,需要在服务器上安装memcached服务,这好像也不是什么重要的缺点。
最后,贴出网站网页在数据访问上的流程图,供大家参考,在下面的文章中我会把实现的方案分享出来。