一种双路XML缓存机制设计与实现 |
2012-06-18 16:06 作者:吴力挽 胡俊峰 来源:硅谷网-《硅谷》杂志 HV: 编辑:GuiGu 【搜索试试】
|
|
摘要:大数据量的访问容易带来web信息系统的性能瓶颈。为减轻web服务器的访问压力,分析传统动态缓存机制和xml节点动态缓存技术的一些弊端,提出一种动静结合的双路xml缓存机制,并给出该缓存机制的具体设计和实现。研究结果表明,双路XML缓存机制极大提高web服务器的响应速度和负载能力。
关键词:双路xml缓存机制;web服务器;节点缓存;访问压力
【《硅谷》杂志2012年5月刊文】
中图分类号:TN929文献标识码:A文章编号:1671—7597(2012)0510
1研究背景
由于web信息系统没有采用负载均衡机制,多并发用户访问容易带来web信息系统事务请求响应时间延长,吞吐量降低,资源利用率不高等性能问题。因此,人们在不断寻找一些优化方法来提高web信息系统的性能。
文献[1]提出了一种动态页面高速缓存技术1],该缓存技术特点是将经常访问的内容经缓存机制驻留计算机内存中,下次用户访问时动态加载内存中的数据内容,从而在一定程度上减轻了服务器的访问压力。这种缓存机制是以依赖内存空间为代价,过分占用内存容易导致系统性能下降,效率不高。文献[2]提出了一种静态页面级缓存[1,2]。文献中提到的页面静态缓存采用模板预编译技术,采用数据变更触发机制,生成内容静态页,数据访问时不经过数据库而是直接访问所生成的静态页面内容。这种机制优点是访问速度快,有利于SEO的检索和收录。不足之处在于对于以前的静态内容很难再修改[2],过多的静态页面文件会占用磁盘空间,大规模的批量更新会增加磁盘的I/O读写,影响磁盘的性能和使用寿命。
本文针对上述缓存机制所出现的问题,提出了一种动静结合的双路XML缓存机制。该机制通过数据库和XML进行双路读写,同步操作触发更新,以XML充当使用库,数据库充当备用库,数据读写均在XML中完成,具有较大的灵活性和扩充性,满足跨平台的应用要求,也极大地提高了服务器的性能和访问速度。
2相关工作
2.1动态缓存机制
动态缓存机制是一种利用内存资源进行系统优化的常规方法,它保存页面动态响应的结果以及应用服务器计算中的中间数据[3]。缓存的过程和步骤如下:
1)缓存初始化。当数据内容被调用时,判断数据是否被缓存。如果被缓存,直接从缓存中读取数据。如果没有被缓存,进入缓存初始化模式,调用缓存实例。
2)数据载入。第一次访问数据库,从数据库中获取数据,同时将这个数据载入到内存中,下次读取直接从内存中读取。
3)请求调用。每个数据缓存内容都有自已唯一的ID,通过ID获取缓存数据单元,访问内存中的数据。
4)缓存过期。缓存都有一定的时间,超过这个时间,缓存自动释放,下次调用重新初始化。
动态缓存机制简单易行,其特点是“以空间换取时间”。对于不大规模量的访问,能在一定程度上加快动态页面的执行速度,改善用户的使用体验。但是通过分析,存在以下不足:
1)缓存命中率问题。缓存的命中率与缓存对象有关[4]。缓存的粒度越细,命中率越高。缓存数据必须遵循一定的原则,公有访问的数据可以利用缓存加载。一旦过多的缓存内容被频繁加载,就会造成缓存失效,命中率较低。
2)内存资源损耗问题。缓存是占用一定的内存单元的,大数据量的访问会占用大量的内存单元。一旦缓存不及时的释放,会造成服务器内存资源耗尽,会造成IIS假死和服务器宕机。动态缓存机制的流程如图1所示:
2.2XML节点缓存机制
由于动态缓存机制存在一些性能问题,近年来,人们研究发现,采用XML节点缓存机制能大幅度提高缓存的命中率,该机制采用集中加载缓存方式,极大的增强了系统的字符串处理能力[5]。
XML节点缓存机制过程如下:
1)建立XMl缓存根节点。以函数的形式建立xml根节点,将此节点载入内存单元中,并以此为根节点,按照xml文本格式依次建立该根节点的子节点。访问时,先访问根节点,再对根节点下的子节点进行访问。
2)生成XML子节点。子节点采用循环的方式,通过数组下标批量生成。在以下代码中,利用GetRow函数将根节点进行缓存,利用For循环建立row节点,通过一个变量循环赋值,利用createNode函数批量建立row节点内容。
3)调用xml缓存节点。采用先赋值,后调用的形式,将数据库表字段的内容进行节点赋值。在以后调用中,不需要从数据库中调取数据,直接访问xml数据节点。
4)释放节点资源。调用节点后,超过一定的时间,就要进行释放内存资源,以备下次调用。
通过分析,该缓存机制存在如下不足:
采用集中加载的方式,以xml节点方式缓存数据表内容,多个数据表需要建立多个xml。多个缓存容易带来名字冲突问题,即使有前缀也有可能产生缓存冲突。另外,使用xml动态节点缓存不能实现多线程,单线程的节点加载和调用,更容易拖慢系统的速度。
3动静结合双路XML缓存设计
3.1实现思路
该缓存机制分为前端部分和后端部分。采用B/S架构模式,采用动态缓存和xml静态缓存相结合的方式。动态缓存采用Application函数缓存数据,下次访问直接从内存中读取。Xml静态缓存采用从xml文件中读取数据,避免了频繁访问数据库。
前端部分:访问页面数据时,判断xml数据文件是否存在,如果存在,直接从xml文件中读取数据,再通过XSLT样式表显示。如不存在xml数据文件,判断页面数据缓存是否存在,如果存在,引入数据缓存,再调用数据缓存。如不存在,从数据库中调用数据,同时将访问的数据进行缓存。
后端部分:录入数据时,将数据录入数据库。同时,生成一个xml数据文件。该缓存机制流程图如下所示:
图1双路xml缓存流程
3.2关键技术实现
1)利用数组创建动态缓存。先定义一个一维数组,数组中放置两个元素,元素1是缓存的数据,元素2表示缓存数据时的时间。元素1是调用时加载显示,在显示的时候要判断该缓存是否过期,这主要是通过元素的时间来判断,没过期就加载缓存单元。缓存过期就从数据库加载数据,并引入缓存函数,生成缓存数据。
建立动态缓存涉及到缓存命名,判断缓存是否过期,写入缓存数据几个步骤。关键代码如下:
PublicFunctionObjIsEmpty()//判断缓存是否过期函数
ObjIsEmpty=True//初始化返回值
CacheDataSet=Application(CacheName&"_"&LocalCacheName)//缓存赋值
IfNotIsArray(CacheDataSet)ThenExitFunction//不是数组退出函数
IfNotIsDate(CacheDataSet(1))ThenExitFunction//不是日期退出函数
IfDateDiff("s",CDate(CacheDataSet(1)),Now())<60*ReloadtimeThen
ObjIsEmpty=False//通过日数组中的日期判断缓存的数据是否过期,过期的将ObjIsEmpty置为False
EndIf
EndFunction//函数结束
PublicPropertyLetValue(ByValvNewValue)//写入缓存数据
IfLocalCacheName<>""Then//条件判断
CacheDataSet=Application(CacheName&"_"&LocalCacheName)
IfIsArray(CacheDataSet)Then//判断是否是数组
CacheDataSet(0)=NewValue//是数组将数组元素1表示缓存数据
CacheDataSet(1)=Now()//将数组元素2表示缓存的时间
Else
ReDimCacheDataSet(2)//不是数组重新定义一个数组
CacheDataSet(0)=NewValue//对数组元素1进行赋值
CacheDataSet(1)=Now()//对数组元素2进行赋值
EndIf
EndProperty//函数结束
2)利用XSLT模板展现XML数据。利用xml文件作为数据源,以xslt作为数据模板,通过转换引擎,将数据以html格式输出。转换过程首先是创建xml的一个实例,将xml文件载入内存,其关键代码如下:
varxml=newActiveXObject("Microsoft.XMLDOM");//初始化一个xml实例
xml.async=false;
xml.load("content.xml");//将xml文件内容载入内存单元中
其次,创建解析器实例,将xslt载入到内存中,其关键代码如下:
varxsl=newActiveXObject("Microsoft.XMLDOM");//初始化一个xsl实例
xsl.async=false;
xsl.load("content.xsl");//将xsl文件内容载入内存单元中
最后,使用XSLT模板来转换xml数据,并将结果在浏览器中显示出来给用户,其关键代码如下:
xml.transformNode(xsl)
解析过程阐述如下:
①用户通过浏览器请求一个动态页面,浏览应用数据。
②web服务器得到该请求后,在服务器上查找该页,并将该页传递给应用程序服务器进行处理。
③应用程序服务器查看该页中的xslt指令,获取xslt指令片段,解析该指令片段。
④应用程序服务器读取xslt片段,获取xml数据,通过css设置格式,执行页面转换。
⑤应用程序服务器将转换后的片段插入web页中,然后将该页传回web服务器。
⑥web服务器将完成的页面发送到浏览器,给用户浏览。
4性能测试
将该缓存机制应用于某业务管理系统中,模拟用户4000个,模拟线程2个,测试时间2分钟,产生Socket连接数一共有857152个,发送的总数据量为190431.72KB,每秒从服务器接收的数据量为1095KB/S,每秒向服务器发送的数据量为1586.96KB/S,接收的总数量为131418.66KB。在4000个模拟用户同时访问该系统,CPU空闲时间较为稳定,服务器压力较小,极大地增强了服务器的负载能力,提高了服务器的响应速度。
5总结
综上所述,动静结合的双路缓存机制能大规模提高服务器的性能,提高应用系统对大规模数据量处理的实时性和准确性,减轻服务器的访问压力。但是,在后续的研究中,该缓存机制有待进一步改进,首先应该考虑缓存单元的细粒度划分问题,通过粒度划分对xml文件数量进行控制。其次,xml文件没有加密机制,涉及到权限问题时,需要对用户进行分级,以便对xml文件的控制和管理。最后,过多的xml文件,需要合理设计目录结构,方便应用系统检索。
参考文献:
[1]赵玉伟、赵小雨、乔木,缓存技术在B/S架构信息系统中的应用[J].计算机工程,2008,34(1):233-235.
[2]高飞、侯瑞春、周志明,Web页面缓存技术在业务系统中的应用[J].计算机技术与发展,2008,34(1):209-211.
[3]VassilakisC,LepourasG.ControlledCachingofDynamicWWWPages[C]//Proc.ofthe13thInternationalConferenceonDEXA.France:[s.n.],2002.
[4]GargPK,EshghiK,GschwindT.EnablingNetworkCachingofDynamicWebObjects[C]//Proc.ofthe12thInternationalConferenceonModellingTechniquesandTools.London:[s.n.],2002.
[5]HayashiH,HaraT,NishioS.Cacheinvalidationforupdateddatainadhocnetworks[M].Berlin/Heidelberg:Springer,2003:516-535.(注:本文版权归作者本人和硅谷杂志所有,禁止他人未经授权转载)
|
|
|
|
【对“一种双路XML缓存机制设计与实现”发布评论】 |
版权及免责声明:
① 本网站部分投稿来源于“网友”,涉及投资、理财、消费等内容,请亲们反复甄别,切勿轻信。本网站部分由赞助商提供的内容属于【广告】性质,仅供阅读,不构成具体实施建议,请谨慎对待。据此操作,风险自担。
② 内容来源注明“硅谷网”及其相关称谓的文字、图片和音视频,版权均属本网站所有,任何媒体、网站或个人需经本网站许可方可复制或转载,并在使用时必须注明来源【硅谷网】或对应来源,违者本网站将依法追究责任。
③ 注明来源为各大报纸、杂志、网站及其他媒体的文章,文章原作者享有著作权,本网站转载其他媒体稿件是为传播更多的信息,并不代表赞同其观点和对其真实性负责,本网站不承担此类稿件侵权行为的连带责任。
④ 本网站不对非自身发布内容的真实性、合法性、准确性作担保。若硅谷网因为自身和转载内容,涉及到侵权、违法等问题,请有关单位或个人速与本网站取得联系(联系电话:01057255600),我们将第一时间核实处理。
|
|
|
|