缓存在项目中的应用

一个项目开发完成后,我们都会进行压力测试以验证非功能性需求是否满足,如果性能无法达到要求,我们一般会从代码、数据库、集群、缓存等一些方面对系统进行优化。其中的缓存,绝对是对项目性能进行优化的一个重点。
所谓缓存,就是在系统内存区中开辟出一块单独的内存区域,把要使用的对象预先加载到这块内存区域中(或将使用过的对象放回到这块内存区域中)。如果应用需要对象时,系统先在缓存中查找要找的东西是否存在,如果没有找到,再从其它地方(如:数据库或物理磁盘)加载,显然,缓存是通过内存访问的高速性,有效地提升了整个系统的性能。
下面,我们通过一个具体的项目,向你讲述voa英语复读网 (www.fudu365.com)中缓存的使用,在复读网开发过程中,我们主要从以下几个方面考虑,来提升系统的高并发响应的:
一、系统持久层采用hibernate开发,我们自然想到了hibernate缓存。Hibernate缓存分为session级缓存与sessionFactory级缓存,而session级缓存对应用程序来说是透明的, session的生命周期比较短, session级缓存对我们的帮助不是太大。sessionFactory级缓是也是二级缓存,我们一般会使用ehcache、oscache等开源缓存框架实现。系统会在启动时将变化机率较小的数据,比如:数据字典等,预先加载出来放到二级缓存,以供程序使用。并且,我们通过对业务的跟踪,找出执行频度非常高的查询(比如:按类别对voa文章的查询),我们将这些查询放入hibernate的查询缓存,以提高性能。
二、对数据库存连接的缓存,即连接池。因为hibernate的一个session,就意味着一个数据库connection,而创建数据库连接又属于昂贵操作,因此,我们都会用数据库连接池来缓存已经得到的边接。项目中一般会采用dbcp或proxool等连接池框架,在这里,我建议大家采用proxool,它在性能及稳定性等方面均优于dbcp,而且,dbcp对mysql连接8小时过期问题非常地烦人。
三、Squid缓存页面对象,你可以从http://www.squid-cache.org/ 下载该缓存框架。复读网对众多的静态页面,全部做了缓存处理。
四、采用分布式缓存,在集群环境中,对单词翻译结果进行缓存,该缓存采用Memcached实现,这也是是根据复读网需求决定的。
在复读网中的英语在线复读机中,用户将鼠标移动到某个单词时,系统将出现该单词的发音、解释,由于当时我们没有找到翻译词库文件,因此,项目组决定从第三方翻译网站查询单词解释,将得到结果生成为WordTranslate对象,存入数据库存,同时放到memcached缓存中方便下次查询。当有另一个用户查询单词解释时,我们将首先从memchched中查找,如果没有找到,再查询数据库存返回对象,同时放入缓存,如果没有找到,再去第三方翻译网站查询。
关于Memcached的使用,请参阅我的另一篇文章。
总的来说,缓存对提高系统性能至关重要,缓存什么对象,采用什么样的缓存策略,都要根据不同的需求而定,不能一概而论,大家要根据不同的项目需求,选择最佳的缓存方案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值