Board logo

标题: 浅谈Web开发中Cache层的设计 [打印本页]

作者: starlight    时间: 2006-10-19 22:45     标题: 浅谈Web开发中Cache层的设计

    在B/S结构中,服务端要接受客户端发来的各种请求并做出响应,当连接数较少时连接池的连接可以胜任这一任务,并且不会有明显的延时。当连接数过于庞大时,设定的连接池的连接难以应对繁琐的操作,而很大程度上可能多数请求所调用的资源可能是同一个,那么多次重复的连接断开就会造成资源浪费和延时现象。通过在Web开发中设计Cache层可以较好解决这一问题。
    下面援引吉林大学的一期学报对此种设计带来的效果的部分描述。
    “在Web Cache体系结构中引入基于集中策略的控制层, 利用控制层监控各个Cache的工作状况, 对其存储空间和工作负载进行全局、有效地控制, 以达到Cache中的存储结构合理化和工作负载平衡.在控制层中实现负载平衡算法解决Cache瓶颈问题, 基于Pull机制的预取算法和TTL与生存系数相结合的淘汰算法提高命中率和系统效率.通过引入这些算法, 使控制层对整个Web Cache层进行有效控制, 从而提高系统的命中率, 极大地缩短请求响应时间.”
    以JSP开发为例,在Web开发中对数据库的操作基本都在Dao中完成,诸如get/selectXXX(...)、updateXXX(...)、addXXX(...)、insertXXX(...)、deleteXXX(...)等方法。很多客户端的响应可能调用的是统一个Dao里的同一个方法,这时只要发现需要调用的方法在Cache中就可以直接在Cache中调用而无须再“连接数据库--调用方法--关闭”。
     首先,对每个调用的方法设定Key和对应的Value,比如getXXX(long a)方法,可以设计为“方法名+参数名”,列如"_getXXXa_"+a,这种命名方式首先是直观明了,把方法和参数结合到一起,一个类里不可能有一模一样的方法,有的只是方法名相同参数不同或参数相同方法名不同,这样命名就可以避免任何一种同名情况下出现两个方法调用到同一个Cache导致出错的情况。
    其次,数据库中的表的定义以及业务的处理可能不是一张表或一个页面就能解决的,可能某一记录后还有子记录,那么对于这样的操作该怎么设计呢?那就是将该页面对应的索引或者说与显示该页面有关的表的主键也放到Key中,比如第一个页面是通过调用Dao里的getXXX(long a)a为该表的主键是该记录的序列号,那么Key就应该和上面说的那样以方法名加参数名,在这个页面还有新增修改删除方法,那么新增修改删除方法对应的Key操作就要和这个get方法的Key一致,新增修改删除传进的参数是TableData,那么Key就要设计成"_getXXXa_"+TableData.getA,以达到和getXXX(a)使用的Key一致,这样才能保证新增修改删除后每次再调用查看方法得到的是刷新后的Cache保持数据一致。
    最后,一个Dao可能写了众多的公共私有方法,而Action里只会调用到部分公共方法,那么设计Cache层的时候,只要把Action里调用的公共方法进行Cache封装即可,无须对每一个方法都封装。Cache封装后的结构可以是Action--Iterface--Helper--Dao,Action调用封装在接口里的方法,Helper继承的是Dao并对Dao的封装,Dao里面的是对数据库的各种操作。
    仅为抛砖引玉,不当之处还请诸位指正。

作者: 城市奔马    时间: 2006-11-25 09:12     标题: 浅谈Web开发中Cache层的设计

有没有更加详细的资料,最好给个实例。
发到我的信箱,谢谢楼主了。




欢迎光临 黑色海岸线论坛 (http://bbs.thysea.com/) Powered by Discuz! 7.2