浏览 5527 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-08
MemCached背景:使用MemCached保存从数据库select出来的某些数据,MemCached作为应用程序和数据库某些数据之间的一个存储中间级。 应用背景:在使用Hibernate时,实现Hibernate二级缓存接口插入到Hibernate中,通过实践,能够轻松将MemCached和Hibernate进行结合应用到实际应用中。 现在转入正题: hibernate如何才能*自动*充分利用MemCached提供getMulti能力? 如果使用了本地的二级缓存(e.g:OSCache,EHCache),利用query.iterate一般能够提高系统的性能,因为iterate返回Iterator后,调用Iterator.next返回对象后(这是还没有去查找命中或select该主键对应数据行),获取他属性时会从二级缓存里查找是否命中,因为这个查找是本地查找,所以效率比较高。 OK,我的问题是: 1)如果我使用的是需要网络行为的MemCached,我照本宣科地,调用Iterator.next,访问其属性时,应用程序通过网络访问MemCached,查找是否命中。假如最好情况我每次next都命中,这是最好的。可是有多少个对象,就有多少次网络访问。这样似乎并不划算,可能比直接query.list更慢。 2)如果我每次都只是调用Iterator.next时,把id纪录下来,放到数组中,再把这个数组传给MemCached,去查看这些数据是否命中,这样可以只有一次网络访问(假如只有一台MemCached)。这样解决了多次网络访问的问题,可是却不是hibernate的自动行为,这很没意思,因为: a)没有命中,怎么办?自己再去session.load对象? b)命中了,又能怎么样?命中了的这些数据现在并不是Hibernate管理的! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-05-08
我觉得你没有必要刻意去减少访问memcached的网络通讯次数问题。我自己做过压力测试,表明Java应用程序和memcached网络通讯造成的系统开销微乎其微。
使用memcached,那么意味着你的Java应用层已经使用了cluster了,在cluster的场景下,系统的瓶颈肯定不会是应用层,因为应用层的cluster只要保持SNA,就理论上可以无限水平扩展。因此系统架构的终极目标就是要尽量减少对数据库的单点压力。 也许1+n次查询,因为多次网络通讯,使得单次页面请求的响应时间稍微下降,但是代价是能够尽可能减轻了对数据库的负担了,那么从整体架构,或者说整个应用性能的角度来说,明显有所提高。 |
|
返回顶楼 | |
发表时间:2007-05-08
〉〉〉Robbin头像变化好大阿~~~惊吓了一下
目前我在重新思考一个产品的重新架构,该项目不是一个互联网项目,而是一个XXX监控项目。 项目的背景: 各种监控设备开启时候需要进行注册(就像手机开机时总是要找个基站注册一样,或类似互联网站的登录操作),设备数量为千至万的级别,他们注册到不同的“基站”中,由基站再统一连接到中心服务器上(java程序,协议为http based,多台集群布属)。注册要牵扯到不少表/对象,不仅仅只是设备对象,而且系统要求设备注册要非常快。设备运行时,总是不时会发生各种安全报警、故障报警、状态报警发送到“基站”,由“基站”转发到中控服务器。发生报警时候,若有预设预案,则设备按照该预案执行响应。预案是操作员事前在中控服务器上定制,在设备注册时返回给设备的。还有一部分操作员,就是整天盯着监控客户端,实时人工处理警报,同时他们还会处理一些小量请求,比如偶尔调整一下设备基本信息(如GIS信息),增加一个设备,增加一个用户,注释一下各种报警事件等等。 对于这样的项目,我计划采用如下策略进行重新架构: 1、所有的设备注册、操作员登录等会话信息使用database+memcached记录保存,把Memcached作为session中心。 2、又因为设备基本信息,人员基本信息,预案,结构/部门,基础字典数据 都是非经常变动的,结合Hibernate使用本地二级缓存(因为:不存在频繁变更数据导致缓存同步广播风暴的问题) 3、对于报警事件,则使用自己的设计,设计一个池,来了报警则先放到内存池中(除非超过数量限制),由其他线程控制负责插入到数据库。防止报警突增导致类似DOS现象。 4、对于操作人员等一些小数据量的操作,则直接insert到数据库。 使用memcached作为session中心,Robbin已经阐述了这种用法,也非常适合我的情况。 hibernate二级缓存方面,在这个项目中,使用本地缓存而非memcached的理由: 1、数据变更并不频繁(就这个项目而言,这是和互联网最大的区别之一) 2、响应必须非常快(我担心memcached可能在多次网络方面不满足要求--也仅仅只是担心而已,还没有实验) 哪些方面还不足呢? |
|
返回顶楼 | |
发表时间:2007-05-09
Qieqie 写道 如果我每次都只是调用Iterator.next时,把id纪录下来,放到数组中,再把这个数组传给MemCached,去查看这些数据是否命中,这样可以只有一次网络访问(假如只有一台MemCached)。
怎么才知道本次next了,是不是就要取出对象立即使用呢...或者说,怎么判断next结束了,我不会再next了... |
|
返回顶楼 | |
发表时间:2007-06-06
提示下吧
分层次,,,全局,局部,个体 关于性能,多想无义,先根据需求设计,搭建,寻找瓶颈,解决。 |
|
返回顶楼 | |