缓存价值

2024-09-23

缓存价值(精选7篇)

缓存价值 篇1

1 镜像缓存系统在运营商市场兴起的背景

随着数字媒体市场规模不断扩大, 以及数字内容的无限提供, 海量的数字内容已经引发了互联网流量出现十倍甚至百倍的急速增长, 特别是移动4G时代的来临代表着互联网数字洪水时代正式来临。HTTP/P2P的迅猛发展很大程度上促进了互联网的蓬勃发展和宽带接入的普及化, 但是其所带来的负面效应也随之显现, 最突出的问题就是对网络资源的滥用。无论运营商如何增加网络带宽, 总是会有新的P2P应用尽力抢占所有可用的资源。这种“黑洞效应”直接影响了运营商网络建设的积极性, 同时也导致其用户满意度下降, 进而间接导致运营商的商业利益受损。目前运营商主要采用的手段是流控, 这种手段通过限制用户对P2P的使用来缓解运营商的网络带宽压力, 严重的影响了用户体验, 显而易见, 这种简单的“以堵制堵”思路治标不治本。

在线视频的迅猛发展源于用户上网习惯的转变, 但受限于网络带宽的制约, 在线视频的体验较差, 难以满足用户对高品质视频内容的需求, 使用户逐渐培养起了“先下载, 后体验”上网习惯。而随着基础网络设施的不断完善, 特别是移动4G网络时代的到来, 用户接入带宽不断提升, 在线视频的质量正朝着高清化的趋势发展, 在这种情况下, 用户更倾向于选择“在线观看”来体验视频等多媒体资源服务。

镜像缓存系统在此背景下应运而生, 以“存储换带宽”的设计理念将互联网主流应用产生的流量进行缓存, 利用海量存储实现流量的本地化, 从而有效缓解运营商骨干网出口的流量压力, 并大幅度地提升了用户体验, 帮助运营商提升ARPU值。

2 镜像缓存系统服务原理介绍

镜像缓存系统是面向电信级运营商和宽带运营商的流量缓存、加速解决方案, 部署在运营商的骨干网出口, 用于HTTP、在线视频、P2P等外网大流量应用的网内缓存, 通过流量本地化帮助运营商解决骨干网带宽压力、用户体验两大问题:

运营商的镜像缓存系统采用旁路的部署模式, 不需要改变运营商现有网络的组网结构, 且不会增加故障点。缓存系统并不是串联在运营商网络中, 而是采用分光/镜像的方式复制了一份流量, 然后通过对复制的流量进行分析后采用重定向技术将用户的请求引导到缓存系统。相对于传统的DNS劫持的缓存系统, 这种镜像缓存部署模式有以下好处:

(1) 缓存系统只重定向系统中已有的资源, 对于系统中没有缓存的资源, 或者系统不提供服务的协议, 缓存系统的存在不影响这部分流量。

(2) 由于缓存系统采用旁路部署模式, 故即使整套缓存系统下线, 业务连续性也不会受到影响, 此时效果与缓存系统部署前一样, 用户直接从外网获取资源。

2.1 镜像缓存系统服务原理介绍

镜像缓存系统分为集中建设模式、分布式建设模式, 顾名思义集中建设模式指在中心节点建设一套镜像缓存系统, 全省的用户都由中心节点提供服务;分布式建设模式指在中心节点建设一套镜像缓存系统, 并且将重定向子系统、缓存子系统下沉到各地州作为子节点, 各缓存子节点就近向用户提供服务。

本文就镜像缓存系统的典型部署模式为例进行分析, 镜像缓存系统一般由分光器、重定向子系统、调度子系统、分析子系统、缓存子系统、管理子系统组成。

2.1.1 镜像缓存系统资源进站原理介绍

镜像缓存系统采用热点探测以及被动缓存技术, 分析用户的访问资源, 当内网用户访问的同一资源达到系统设定的热点阀值后, 缓存子系统才会把资源从网外下载到缓存系统, 为后续的用户访问提供服务。

当缓存系统的磁盘空间的利用率大于设定阀值时, 需对缓存资源进行磁盘空间清理, 将磁盘空间利用率降低, 保证有足够的缓存空间供后续新资源进站。在做磁盘清理的时候, 优先删除缓存系统中最长时间没有被访问的资源。

2.1.2 镜像缓存系统服务流程

(1) 用户向外网服务器发送资源请求;

(2) 缓存子系统判断资源是否已缓存, 若缓存则发送重定向消息给用户;

(3) 用户向调度子系统发送资源请求;

(4) 调度子系统返回缓存服务器的地址给用户;

(5) 用户到缓存子系统下载资源;

(6) 缓存子系统上传资源给用户。

3 镜像缓存系统对运营商的应用价值

3.1 缓解带宽压力, 降低网间结算成本

业界采用缓存吞吐比对于缓存系统的服务效果评估, 认为缓存吞吐比为1:N, 若N>=5则缓存系统的服务效果良好;若N<5, 则缓存系统的服务亟待优化。缓存吞吐比1:N意味着单位时间内缓存系统从外部系统成功接收数据的数量:单位时间内缓存系统向用户成功传送数据的数量, 即表示缓存系统中的每一份资源均减少了N-1次的网间重复访问。缓存系统部署后骨干网的P2P流量占比由60%降至40%。

目前缓存系统的吐出能力约为运营商骨干网均值流量的1/2, 也就是说, 缓存系统解决了50%的网间流量。

3.2 提高用户体验

镜像缓存系统通过将达到热点的资源, 下载到本网内, 避免了由于骨干传输网络的时延导致的响应延迟, 极大的减少了用户的等待时间, 提升了用户满意度和忠诚度, 并且吸引新用户入网、减少老用户流失。

根据测试报告, 加速后的HTTP平均下载速率比加速前提升了5倍, 流媒体平均缓冲速率提升了1.5倍。

摘要:面对互联网流量的迅猛发展, P2P对网络资源的滥用。运营商前期通过限制、管控P2P应用以达到缓解网络带宽压力的方式效果并不显著, 近年运营商开始采用“以存储换带宽”的模式, 建设缓存系统, 希望通过主动分析用户访问行为, 将大部分P2P流量疏导到网内, 从而降低P2P类低价值流量对运营商带宽的冲击, 提升运营商的ARPU值。本文基于镜像缓存系统的服务原理, 对该系统的价值进行了分析研究。

关键词:镜像,流量,缓存

参考文献

[1]盖玲.互联网流量监控疏堵技术的研究与应用[J].电信科学, 2010.

[2]赵志军."疏堵结合"—P2P内容缓存方案[J].信息通信技术, 2007.

[3]秦秀磊, 张文博, 魏峻, 王伟, 钟华, 黄涛.云计算环境下分布式缓存技术的现状与挑战[J].软件学报, 2013.

[4]仇德成, 汪树勋, 徐德启.Cache技术在P2P中的应用[J].通信技术, 2009.

基于缓存框架的Web缓存研究 篇2

1 缓存框架OSCache研究

OSCache由Open Symphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能。OSCache也是一个被广泛采用的高性能的JZEE缓存框架,它能应用于任何Java应用程序的缓存解决方案。

OSCache是Open Symphony组织提供的一个J2EE架构中Web应用层的缓存技术实现组件,它能缓存任何Java对象,拥有全面的API,可以永久缓存,支持集群,缓存过期控制等等。

1.1 缓存标签实现部分页面缓存

OSCache提供一系列的JSP标签库,实现主要缓存功能,这些标签是:cache、usecached、flush等等。

1)cache标签

这是OSCache标签库中最重要的一个标签,使用格式如下:

some JSP content//需要缓存的内容

包括在标签之间的内容将被缓存处理。页面第一次加载的时候,标签中的内容被处理并被缓存起来,页面被再次访问的时候,缓存机制首先会检查这部分内容是否失效。如果缓存内容已经失效,这时缓存内容将被重新处理并且返回处理过后的信息;如果缓存内容没有失效,那么返回给用户的将是缓存中的信息。

2)usecached标签

这个标签是cache标签的一个嵌套标签,主要用在程序控制中通知父标签是否使用以前的缓存内容,如:

<%try{%>

some JSP content//需要缓存的内容

<%}

catch(Exception){%}

<%}%>

上述代码在系统容错性方面提供了很好的容错方案。当程序捕获到异常时,通过Catch分支中usecached标签的use属性执行操作。当use属性值为true时,读取缓存内容。若此时系统发生错误,用户看到的不再是单调乏味的报错页面而是储存在缓存中的内容。

3)flush标签

该标签的作用体现在允许操作者在任意运行期间自主手动刷新缓存内容。格式如下:

上述代码表示刷新session范围内键值为my Example的缓存内容。

1.2 Cache Filter实现整个页面缓存

在OScache组件中提供了一个cache Filter用于实现页面级缓存,开发者只需配置Web.xml便可实现该功能。Cache Filter用于对Web应用中的某些动态页面进行缓存,尤其是那些需要生成PDF格式的页面以及包括大量图片文件的页面。Cache Filter的运用不仅缩短了服务器响应时间,减小了数据库服务器的压力,而且显著提高了Web服务器的性能。

1.3 Java API for OSCache缓存管理

在实际应用中除了JSP标签库,还可以使用OSCache提供的Java API。其中有一个重要的Java类———General Cache Administrator,用它来建立、刷新和管理缓存。

2 Hibernate数据缓存

在操作数据库的时候,通常使用SQL语句添加、删除、更改、查询数据,ORM(object Relational Mapping,对象关系映射)通过使用描述对象和数据库之间的映射,将Java程序中的对象自动持久化到关系数据库中。Hibernate正是一个ORM的实现,它使得与关系数据库打交道变得十分轻松,就像操作普通Java对象一样,同时不必考虑如何把它们从数据库表中取出或放回到数据库表中。Hibernate模型结构如图1所示。

2.1 Hibernate一级缓存和二级缓存

Hibernate提供两级缓存,一级缓存是Session级别的缓存,属于事务范围的缓存。这一级缓存由Hibernate管理,一般情况下无需进行干预;二级缓存是Session Factory级别的缓存,属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。Hibernate的二级缓存由从属于Session Factory的所有session实例共享,Hibernate二级缓存的工作过程如下:

l)查询的时候,形成一条SQL语句“select*from table_name where…(查询条件)”查询数据库,一次性获得所有的数据对象。

2)把获得的所有数据对象根据ID(对象在业务表中的唯一标识)放入二级缓存中。

3)当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查找,并按从一级缓存,到二级缓存,再到数据库的顺序查找,直到找到查询结果,并把结果按照ID放入缓存。

4)删除、更新、增加数据的时候同时更新缓存。

显然,对数据库中所有的数据都实施缓存是最简单的方法。但是,如果没有对当前数据的使用情况进行考察就全部缓存起来,内存会迅速被几乎不可能再重用的数据充斥,系统的性能会急剧下降。因此,只有当数据满足一定的缓存条件时,才可以将其纳入缓存管理。

2.2 Hibernate二级缓存的实现

Hibernate为众多的第三方缓存组件提供接入接口,如JCS,Ehcache,OSCache,Swarm Cache,JBoss Cache等。Hibernate对缓存进行了良好封装,透明化的缓存机制使得在上层结构的实现中无需面对繁琐的缓存维护细节。目前Hibernate支持的缓存机制通过下面的Java类来实现net.sf.Ehcache.hibernate.Provider,net.sf.hibernate.cache.OSCache Provider,net.sf.hibernate.cache.Swarm Cache Provider,net.hibernate.cache.Tree Cache Provider。

3 Web应用缓存方案的提出

企业级的Web应用除了实现核心业务外,还包括必不可少的查询模块。针对查询模块出现的问题,结合上述缓存技术提出一个解决方案。

3.1 查询模块

查询模块,通常是一个用户接口。通过该接口,用户可以查看存储在数据库中的各种信息。一般来说,使用查询模块的员工分为两类:一类人员是使用该系统的一线操作员,另一类人员是通过该模块查看并掌握业务总体情况的领导。

对于一线操作人员来说,查看的数据量相对较少。因为他们只需关心自己最近一小段时间内处理那部分数据,特别是每一条记录的详细明细。这类人员对这些记录的关心程度与时间先后顺序密不可分,越是新近的操作记录他们查看的频率越是高。并且这些记录都保持稳定,生成后不再被更改。因此,对数据库的查询结果进行缓存是一个良好的系统提速方案,可以显著提高系统的响应速度。

一线操作员的查询流程归纳为以下几个步骤:

1)用户选择或者输入查询条件,提交查询请求。此时系统形成完整的SQL语句提交给数据库,例如:“select*from table_name where condition”。

2)系统根据形成的SQL语句从数据库中读取所有符合查询条件的实体列表,显示在前台页面。

3)用户查看实体列表,找到真正关心的某一条数据,查看详情。此时传递该条记录的ID号,形成新的SQL语句:“select*from table_name where id=***”。

4)数据库服务器进行再次查询同时返回该条记录详细信息。

从上述流程了解到,对数据库的实体查询操作并不涉及实体的更新。一旦信息被返回,用户不会关注查询过后数据库中的数据是否发生改变,而且用户更加关注最新的一条或几条记录。因此,对数据库的查询结果进行缓存是一个良好的系统提速方案。具体思想为,将查询出来的所有记录进行分页显示,并将第一页里的每条记录信息由动态页面转化为静态页面缓存起来。提供一个专门的Java类,负责将动态页面按规定的模式解析成为静态页面,并将每条记录的明细页面保存为“***.html”的形式,其中***为该条记录的ID号码。一线操作员使用查询模块的缓存方案流程如图2所示。

使用查询模块的另一类用户是领导。他们通过查询模块了解一段时间内发生业务的总体情况,其时间间隔较长,查询数据量较庞大。对于这样的查询,查询响应的速度显得尤其重要。无论是访问数据库还是将查询结果显示到前台都会耗费过多的系统资源,必须实现分页功能缓解系统压力。将查询出来的数据一并放入缓存,只有当用户需要查看具体某页的时候才显示该页的查询结果。这样做可以避免重新获取和释放对象,不必每次都从数据库中获取数据。

此时需要这样一种机制,不仅能够在内存中保存对象同时也提供保持内存中对象更新的功能,即对象缓存。Hibernate通过对不同数据库的统一接口设计,实现透明化通用分页实现机制。以下是实现分页功能的关键函数:

Criteria.set First Result(int x)//从第x条记录开始获取

Criteria.set Fetch Size(int y)//获取记录大小

更重要的是缓存框架作为第三方插件可以方便的引入到Hibernate中,因此对于查询模块的缓存设计提出Hibernate整合缓存框架的方案。领导使用查询模块的缓存方案如图3所示。

3.2 缓存框架的选择

在选择缓存框架之前,首先列出选择缓存框架需要达到的目标:

1)在Web应用中能够快速访问数据。

2)提供可配置的缓存管理,以便通过描述方式而不是编码方式修改参数。

3)发挥多个缓存框架的优势,提供符合具体项目需求的缓存框架结构。

4)最流行的Java开源缓存框架是OSCache和Ehcache。对于运用JSP开发表示层的Web应用来说,OSCache是一个易于操作并能快速提高性能的页面级缓存,但是对于Hibernate来说OSCache并不是最好的选择。而Ehcache本身出自于Hibernate,能够更好的支持Hibernate。因此,采用Ehcache作为Hibernate的二级缓存实现。

从整个系统的角度来说,具体缓存方案为:利用Ehcache作为Hibernate的二级缓存,实现查询结果的对象缓存,同时利用0SCache实现对JSP页面的缓存。

上述缓存方案应用于湖北省水路交通规费征稽网络系统,实现从略。

4 结束语

改文重点阐述了缓存框架OSCache的缓存组件与Hibernate的数据缓存管理。Hibernate不仅能够提供强大的、高性能的数据查询功能,而且还拥有良好的缓存管理机制。本文提出将第三方组件OSCache、Ehcache和Hibernate整合在一起的Web缓存方案,实现了页面缓存和查询结果的对象缓存,很大程度地改善了系统的性能。

参考文献

[1]赵玉伟.WWW中缓存机制的应用研究[D].武汉:武汉理工大学,2006.

[2]Duane Wessels.Web Caching[M].United States of America:O'Reilly&Associates Inc,2001:1-6.

[3]阎洁.Web应用若干关键技术的研究[D].武汉:武汉理工大学,2008:33-46

[4]opensymphony.What is OSCache[EB/OL].http://www.opensymphony.com/oscache/wiki/what%20is%20OSCache.html,2005.

[5]opensymphony.Tag Reference of OSCache[EB/OL].http://www.opensymphony.com/oscache/wiki/JSP%20Tags.html,2005.

[6]Object Renational Mapping-Persistence and Caching for Java[EB/OL].http://cayene.apache.org,2007.

[7]夏昕,曹晓钢,唐勇.深入浅出Hibernate[M].北京:电子工业出版社,2005.300-301.

如何引导大缓存 篇3

数据计算、数据传输及数据存储是IT系统中三大组织结构, 存储设备担负着数据存储。随着计算资源的增加和业务快速响应的需求, 由于存储设备自身的结构问题, 导致存储成为整个计算系统的性能瓶颈。通过提高存储的处理能力, 从而大幅度提高整个计算系统的数据处理能力, 提高存储缓存可以快速有效地提升存储性能。存储缓存包括容量、性能、可靠性三个相辅相成的方面。缓存性能包括缓存的传输带宽、周边配套总线和外设的带宽、缓存的分配调度算法等方面;缓存可靠性包括缓存镜像保护、掉电保护的机制;缓存容量体现在最大容量、按需配置等方面。容量、性能、可靠性这三方面缺一不可, 任何一部分的缺失, 都会影响到存储缓存的实际效用。因此, 增加缓存容量绝不仅仅是增加几根内存条那么简单, 其架构设计复杂, 这也是专业存储系统的设计核心。存储本身是由大量机械磁盘组成的磁盘阵列, 除了努力提高单个磁盘的IO能力, 通过增加存储的缓存容量、提升缓存性能、优化缓存算法同样可以迅速、经济的提高存储性能。

2 存储缓存的作用

相对于服务器的缓存, 存储设备的作用和特点决定了存储缓存自身的作用:

(1) 数据缓冲功能:磁盘驱动器不能快速响应服务器及其业务软件产生的频繁读写操作, 需要通过存储缓存作为缓冲池来平衡两者读写性能差距。缓存分为读缓存和写缓存, 分别用于服务器读取存储设备数据和写入数据, 合理的缓存调度算法和大容量缓存, 可以很好地提升存储读写性能。针对不同的应用环境, 可以灵活地分配读写缓存分配比例及缓存块大小。

(2) 数据管理功能:存储自身是一个独立的计算系统。存储有诸如快照、快照视图、复制、镜像、自动精简配置、RAID等功能, 当存储开启功能套件时, 软件运行在存储的缓存中, 直到存储关闭功能套件才退出缓存。当存储启动越多功能套件, 所占用存储缓存就越多。每个功能套件实现的原理不同, 其复杂度也不同, 所需要的缓存也不一样, 这些功能越丰富、越复杂的功能套件对存储的缓存需求也更多。

(3) 存储自身需求:存储底层平台是一个操作系统, 存储启动时需要加载操作系统, 其自身也占用一定的缓存, 随着存储平台的不断完善和功能不断增加, 存储操作系统所占用缓存从几百MB到几GB不等, 且一直驻存在缓存中。

3 存储缓存的配置

由服务器的应用程序所产生的IO数据流处理、存储层RAID校验的计算、缓存读写策略等, 都需要通过存储缓存来处理, 存储缓存的容量、性能、缓存的算法直接影响着存储对数据处理的快慢, 也是影响业务快慢的因素之一, 存储设备数据处理越快, 对服务器的响应也就越及时。通常对存储缓存配置大小有影响的是:

(1) 服务器上的业务需求:一方面服务器将业务软件产生的数据写到存储, 另一方面服务器从存储设备上读取业务软件所需数据, 通常读数据的请求远高于写数据的请求。当存储设备接入大量服务器, 特别是在业务高峰期时段, 就需要高性能存储支撑业务, 特别是对非顺序读写数据、大文件读写对存储缓存要求更高, 服务器数量及业务量越多, 读写数据就越多, 面对业务密集型情况, 更容易产生爆发式的数据请求, 对存储设备的IOPS要求就越高, 从而需要更大的缓存来处理。一般的, 服务器的缓存越大, 意味着其处理性能越强, 对后端存储要求更高, 需要存储配置相应的缓存, 通常来讲, 存储可用缓存大小为接入到存储的服务器缓存的1/3, 则可以很好满足业务响应。表1中列出推荐服务器内存大小和存储缓存之间的配比。

(2) 磁盘及LUN的影响:磁盘自身机械性质决定了磁盘转速, 低转速限制了磁盘的读写性能, 一块机械盘IOPS一般在150到250之间, 而处理器的运算能力达到上百亿级别, 两者之间的性能存在上万倍差距。另外, 业务数据量的增加, 不可避免的需要更多磁盘来储存数据。存储设备通过大量磁盘形成存储池, 将存储空间通过LUN映射的方式分配到服务器, 服务器的读写都是在LUN上进行, 数据读写操作都发生在磁盘上, 磁盘与处理器的差距必须依靠缓存作为缓冲池来弥补。磁盘数越多, IO分布就越广, 就需要相应更大的存储缓存;LUN上数据的读写都需要通过缓存处理, 实际验证表明, LU N越多, 需要开销的缓存越多, 单个LU N配置缓存越大则读写性能越好。通常单个正常读写LUN配置1GB缓存, 读写操作比较频繁的LUN配置5GB至2 0 G B缓存。如图1所示, 实际测试环境下, 将LU N配置缓存从1GB增加到20GB, 性能可提升20倍至40倍, 同一块LU N配置缓存越大则性能越好。

缓存模块设计浅谈 篇4

下面我们以Map接口为例来说明设计下文件存取模块使用各种实现类时, 总是要生成数据结构的具体实现, 因为系统不知道集合中如何存放对象。但在访问实际集合时, 用使用接口的方法, 这样就可以在需要时将数据结构从数组集合变成散列表的集合然后由于集合类仍然实现相同的集合接口, 不需要改变他的代码。

用何种方式存放对象呢?这是缓存最为重要的一步, 在Java 2中有很多的数据结构接口, 接口和集合类的选择是缓存非常重要的。

Map接口用于保持关键字 (Key) 和数值 (Value) 的集合, 集合中的每个项目加入时都提供数值和关键字

Map接口有三个实现集合类;Hash Map、Weak Hash Map、和Tree Map类。Hash Map是基于Hash表的映射;Weak Hash Map是基于弱引用Hash表的映射;Tree Hash是基于平衡树的映射。

Hashtable继承自Dictionary类, 而Hash Map是Java1.2引进的Map interface的一个实现Hash Map允许将null作为一个entry的key或者value, 而Hashtable不允许还有就是, Hash Map把Hashtable的contains方法去掉了, 改成containsvalue和contains Key。因为contains方法容易让人引起误解。最大的不同是, Hashtable的方法是Synchronize的, 而Hash Map不是, 在多个线程访问Hashtable时, 不需要自己为它的方法实现同步, 而Hash Map就必须为之提供外同步。Hashtable和Hash Map采用的hash/rehash算法都大概一样, 所以性能不会有很大的差异。

Hash Map可谓JDK的一大实用工具, 把各个Object映射起来, 实现了“键--值”对应的快速存取。但实际里面做了些什么呢?

在这之前, 先介绍一下负载因子和容量的属性。大家都知道其实一个Hash Map的实际容量就因子*容量, 其默认值是16×0.75=12;这个很重要, 对效率很一定影响!当存入Hash Map的对象超过这个容量时, Hash Map就会重新构造存取表。两个关键的方法, put和get:

先有这样一个概念, Hash Map是声明了Map, Cloneable, Serializable接口, 和继承了Abstract Map类, 里面的Iterator其实主要都是其内部类Hash Iterator和其他几个iterator类实现, 当然还有一个很重要的继承了Map.Entry的Entry内部类, 它包含了hash, value, key和next这四个属性, 很重要。

这个就是判断键值是否为空, 并不很深奥, 其实如果为空, 它会返回一个static Object作为键值, 这就是为什么Hash Map允许空键值的原因。

我们把关键的方法拿出来分析:

因为hash的算法有可能令不同的键值有相同的hash码并有相同的table索引, 如:key=“33”和key=Object g的hash都是-8901334, 那它经过indexfor之后的索引一定都为i, 这样在new的时候这个Entry的next就会指向这个原本的table[i], 再有下一个也如此, 形成一个链表, 和put的循环对定e.next获得旧的值。到这里, Hash Map的结构, 大家也十分明白了吧?

所谓的重构也不万能的, 就是建一个两倍大的table, 然后再一个个indexfor进去, 如果你能让你的Hash Map不需要重构那么多次, 效率会大大提高!

参考文献

[1]飞思科技产品研发中心.《Java2应用开发指南》.电子工业出版社.

[2]王亚平.《数据库系统工程师教程》.清华大学出版社.

Web缓存替换算法综述 篇5

在Internet飞速发展的今天,互联网已成为网上生活的基本工具,被人们称为第四媒体。而网上商务活动的实现更依赖于网络的独特优越性,大量重要的数据可在几分钟甚至是几秒钟内送达。然而恰恰是由于互联网的流行,人们开始抱怨网络浏览速度太慢,虽然采用了各种办法,然而投资巨大却都不能收到很好的效果,World Wide Web变成了World Wide Wait[1][2]。

Web缓存是处于用户和Web服务器之间的信息缓冲机制,该技术的基本思想是:把经常访问的信息(Web文档)存放到用户的附近(或本地),以便后续的访问能够从客户机或本地服务器获得该信息,而不必访问远地Web服务器。Web缓存通过信息的本地化来减少网络流量和加快浏览速度,它可以从两方面改善用户感觉到的网络性能:一方面,当从本地为用户提供服务时,缓存屏蔽了广域网延迟和服务器的处理时间,加快了响应的速度;另一方面,缓存还可以屏蔽广域网节点的暂时不可用性,从而使网络显得更加稳定。

2、Web缓存替换算法

缓存的一个关键性问题是替换策略。Web缓存替换策略方面已有大量的研究[2][3][4][5]。由于Web缓存的存储容量有限,当存储区被占满后,新的对象就无法存储,这时需要按某种策略将一部分当前不再具有存储价值的对象替换出去,替换策略的好坏决定了缓存的命中率、字节命中率等指标,从而在很大程度上决定Web缓存系统的性能。

2.1 缓存替换算法模型

由于Web缓存的存储容量有限,当存储区被占满后,新的对象就无法存储,这时需要按某种策略将一部分当前不再具有存储价值的对象替换出去,因此替换策略的好坏决定了缓存的性能。

通用的缓存策略可以描述如下:假定O是一个用户可以访问的所有数据对象的集合,对每一个对象d∈O,相应的对象大小为Sd,访问该对象的成本为Cd。假定缓存容量大小为C,请求序列R=R1, R2, ……, Rm导致缓存的一个状态序列S0, S1, ……, Sm,其中S0是缓存初始状态,即没有缓存对象时的状态。对每一个Sk, k=1, 2, ……, m.

表示移出缓存的对象集合, 在所有满足该公式的状态序列中, 找出一个状态序列, 使得成本函数:

的数值最小, 其中

{Sk}表示状态序列。针对一般缓存替换的数学模型, 得出一般缓存替换算法,如算法2-1。

算法2-1:Web缓存替换算法

Input:请求序列R=R1R2…….Rm;

Output:缓存对象;

Method:

Step1.轮流对请求的文档对象进行处理,令当前请求对象是d;

Step2.ifIsInCache (d) //如果d已经在缓存。

新d所对应的键值K (d);

Else

While (缓存没有足够空间保存对象d)

For (缓存中所有对象di)

D=Min (K (di) ) ;

替换D所对应的对象

Step3.将d装入缓存;

Step4.设置d所对应的键值K (d);

基本思想是:将新请求的文档放到Cache中,如果没有足够的空间,就把权值(k)最小的文档替换出来,直到Cache有足够的容量容纳新的文档。

2.2 常用Web替换算法描述

(1)最近最少使用策略(Least Recently Used, LRU)

该算法在传统的计算机高速缓存LRU算法基础上,稍加改造得出的,即:当Web缓存的剩余空间小于被请求文件的大小S时,重复将最久未使用的文档移出缓存直到缓存剩余空间增加为S。LRU算法为了使一个较大的文件进入缓存有可能会替换掉许多小文件。

(2)对象大小策略(Size)

SIZE算法的思想是替换最大的文档。当缓存剩余空间不够容纳一个需要调入的对象时,缓存中最大的文档将被替换出缓存,以便容纳更多的小文件。其优点是:因为换出的空间相对大,随后可以容纳很多小网页副本,所以可能会产生较高的命中率。然而字节命中率可能偏低,而且再次下载大网页时,会占用较多的网络资源。

(3)最少使用频率策略(Least Frequently Used, LFU)

其基本思想是替换访问次数最少的文档。这个算法保留那些经常访问的Web文档,将缓存空间中被访问次数最少的网页副本换出。算法的本质是采用文档的流行度作为替换的依据。LFU的优点是实现简单,只需对每个缓存副本维持一个计数器。缺点是没有考虑网页的年龄、大小和获取网页的访问延迟。改进的算法有LFU-Aging,将网页副本的年龄作为算法的辅助因素,避免了缓存"污染"。

(4)最低关系值策略(Lowest Relative Value, LRV)

LRV算法考虑了时间局部性、成本和对象大小因素,通过计算LRV值替换该值最小的对象。对给定i, Pt表示一个已经被请求了i次对象p被请求第i+1次的可能性,它通过在线计算Di+1/Di得到的,其中Di是所有那些已经请求过i次的对象。Pt (s) 与Pi的不同在于前者限定了对象的大小s。此外,1-D (t) 表示自从上次被请求后再次被请求之间的时间t(以秒计)。D (t) 的计算如公式2.2:

对于那些大小为s代价是c的特殊对象d, 如果上次对它的请求正好是第i次且上次的请求发生在t秒前, 则对象d的值如公式2.3:

(5)混合策略(Hybrid)

这种算法综合考虑文件大小、访问次数、提供该文件的服务器的性能等因素,计算每个文件的保留价值,替换保留价值最小的文件。算法目的在于降低网络总延迟。该算法设计了一个函数用来计算每个文件的保留价值。当计算完所有文件的函数值后,价值最小的文件将被替换出缓存。令位于服务器s上的文件p的函数值为fHYB,该函数值由以下几个参数共同决定:

Cs:连接服务器s的时间;

bs:服务器s的带宽;

np:文件p自从进入缓存后被请求的次数;

zp:文件p的大小(Byte);

该函数定义如下:

(6) Greedy Dual-Size策略 (GDS)

GDS算法考虑了文件可能有不同大小的因素,能够替换效用最低(the lowest utility)的对象。这种策略对于一定效用(成本)函数来说替换其键值最小的对象。当一个对象i被请求时,它被赋予一个优先权键值Hi=Ci/Si+L,其中Ci是把对象i取到缓存有关的成本,Si是对象大小,L是运行时间因素,开始时L=0,当对象f被替换时就用这个对象的优先权Hf更新L,即L=Hfㄢ

(7) GDS-Frequency策略(GDSF)

引入使用频率因素的GDS策略,它克服了GDS的弱点。具体的如公式2.6:

要得到最大的对象命中率,则Ci=1。据统计在256MB缓存下使用该策略会有40%的对象命中率。

(8) Log (Size) +LRU策略

这种算法的思想与SIZE算法基本上相同,所不同的是在确定文件大小时以Log (sizez)为标准,找出Log (sizez)最大的一个或几个文档,并且在所有Log (sizez)相同的文件中替换最近最少使用的文件,即按LRU方式替换。

(9)最近最少使用-阈值策略(LRU-Threshold)

由最近最少使用策略变化而来,是LRU算法的一种变体。所不同的是它不缓存较大的文件,即对于大小超过一个给定阈值的对象不以缓存。或者说这种算法只允许小于某个阈值的文档进入缓存,不论缓存中的剩余空间是否能够容纳这个文档。这种算法能够避免由于一个较大文档进入缓存,导致大量较小文档调出缓存的问题。

(10) Lowest-Latency-First策略(LLF)

通过替换最小下载延迟的对象来最小化平均延迟。

3、总结

本文通过对W eb缓存系统、Web缓存数学模型及算法描述及替换算法几个方面作了一个总结。希望本文的工作能给相关的研究人员起到参考作用。

摘要:Web缓存技术是提高WWW性能的最主要的方法, 属于延迟容忍技术。Web高速缓存技术实现了Web内容的关键节点 (包括本地) 存储, 它能减少网络带宽的占用, 降低硬件成本, 改善响应时间, 提高了最终用户的效率。本文对目前常用的Web缓存替换算法作了一个总结。

参考文献

[1].Lei Shi, Yingjie Han, Xiaoguang Ding, Lin Wei, Zhimin Gu, An SPNbased Integrated Model for Web Prefetching and Caching[J], Journal of Computer Science and Technology, 2006, 21 (4) :482-489.

[2].贺琛, 陈肇雄, 黄河燕, Web缓存技术综述[J], 小型微型计算机系统, 2004, 5 (25) :836-842.

[3].Jianliang Xu, Qinglong Hu, Wang-Chien Lee, Performance Evaluationof an Optimal Cache Replacement Policy for Wireless Data Dissemination[J], IEEE Transactions on Knowledge and Data Engineering, 2004, 16 (1) :125-138.

[4].E.Cohen, H.Kaplan, Exploiting regularities in Web traffic patterns forcache replacement[J], Algorithmica, 2002, 33 (3) :300-334.

模块化本体缓存方案 篇6

随着对某个领域认识的深入,相应的领域本体也越来越大,大规模单一本体会带来一系列问题:在大规模单一本体上进行推理的效率低;即使只需要小部分知识也要引入整个本体,重用率低;开发者需了解整个本体,不利于分工合作和本体进化等。模块化是有效克服这些问题的方法,通过模块化,本体被分成若干个功能相对独立的模块,而在模块化本体中引入接口的方法,能进一步提高模块的独立性。

模块化本体中,一个本体模块在进行推理时,可能要用到多个其它模块的知识,甚至于这些模块分布在网络中的不同主机上。引入缓存即通过对一些概念和角色的术语和断言进行缓存,能够提高本体推理的效率。为了保持本体缓存的一致性,当相关模块的知识变化时,应及时更新缓存的对象。

1 基于接口的模块化本体

在基于接口的模块化本体中,本体被定义成接口和本体模块的集合[1],一个接口是一个概念名、角色名和关于它们的包含公理集合,而一个本体模块是一个可以用任何描述逻辑语言表达的本体。通过引入接口的概念,将本体模块的知识分为公有部分和私有部分。

本体表示语言的逻辑基础是描述逻辑[2],描述逻辑的知识库由ABox(断言)和TBox(术语)两部分组成。ABox是一个关于个体的断言组成的有限集,形如C(a)或r(a,b),其中C是概念名而r是角色名,a、b是个体名,在本体表述中,个体指概念的实例。TBox是一个概念包含公理的有限集,形如A哿B,其中A和B是概念表达式。

每个接口中的TBox公理构成了本体模块的共享段,共享段的逻辑结果会被传播到所有其它相关模块中,以下是接口的定义:

定义1:一个接口定义为I=其中T是接口的TBox,Cn和Rn分别是在T中用到的概念和角色的名称集合,接口I中没有ABox断言。

本体模块的断言集和内部TBox公理是私有的,只能通过知识查询来访问,私有段知识的改变只在局部知道。每个本体模块指定它要使用的接口集和它实现的接口集。当作为接口的实现者时,该模块将提供接口中有关概念和角色的解释;当作为接口的使用者时,能够集成接口实现者模块的知识。以下是本体模块的定义:

定义2:一个本体模块定义为M=<Ψ,Ir,Iu>,其中Ψ由模块内的TBox公理和ABox断言集合组成,Ir是模块M实现的接口集合,Iu是模块M使用的接口集合。

本体模块具有局部语义和清晰接口,从而进一步提高了模块的独立性。一个本体模块使用另一个模块时,是通过使用接口实现的。在基于接口的模块化本体中,模块的进化和接口的配置是分开的。在模块进化时,仅确定了使用的接口而没有确定接口由哪个模块实现,这样就不必知道被使用模块的名称和符号;在配置时,选择模块来实现接口,使得实现者模块容易被替换。

2 缓存方案

2.1 缓存对象

由于在缓存方案中,对角色的处理和对概念的处理是相似的,以下仅讨论对概念的处理。在基于接口的模块化本体中,如果某模块在推理的过程中用到其它模块的知识,则需要向相关接口发起查询,从接口的实现者模块中查得相关概念的实例。为了尽可能地缩短本体推理的时间,每个本体模块可以分配一个缓存空间,用来存放经常被查询的外部知识。文献[3]提出本体模块存储所有用到的外部概念之间的包含公理,这在时间复杂性和空间复杂性上是难以接受的。另外文献[3]没有区分外部概念之间稳定的和暂时的包含公理之间的区别,不能高效地更新有稳定子集关系的相关概念。而在基于接口的模块化本体中,模块使用者用到的外部概念放在接口中,同时接口中的TBOX中存放这些概念间稳定的包含公理。而对于因组合爆炸产生的数量巨大的暂时性包含关系则由实现者模块决定,是动态的。在实现者模块中并不存储这些暂时的包含关系,而只是解释接口中概念,概念之间的包含公理由它们的实例决定,知识的存储是线性的。使用者模块可以向接口发起查询从而获得相关概念的实例,而被查询概念稳定的祖先概念可以由接口中TBOX推理出。

本方案中缓存的知识主要由两部分构成:ABOX缓存知识和TBOX缓存知识。ABOX存放一些经常被查询的概念有哪些实例,例如“直辖市”概念有北京、上海等实例。TBOX存放经常被查询的包含关系,假设A和B两个概念中至少有一个是外部概念,如果经常要查询A和B的包含关系,查询结果(例如是A哿B)则被缓存。由于缓存空间的有限性,当缓存空间将要用尽时,可以采用最近最久未用法等置换算法删除一部分缓存内容。

采用缓存机制后,推理如果用到外部模块的知识则先在缓存中查找,如果命中则本地的知识便能完成推理,否则再向实现者模块发起知识查询,根据局部性原理,这样能够显著缩短平均推理时间。

2.2 缓存一致性

当一个本体模块的相关模块知识改变时,可能会造成缓存内容的失效。在文献[1]中,一个本体模块对相关模块的知识集成是通过发起知识查询来进行的,然而如果对缓存中的概念不断发起知识查询,以此来判断有无发生更改显然是低效的,会造成模块间通信量的剧增和相关模块推理任务的加重。本研究中,用中断的方式来替代查询的方式,由发生知识改变的模块负责发送消息给相关模块。

若某模块的知识发生变化时,首先确定该知识变化所影响的概念,如果相关的概念都未在接口中出现,则说明对接口的解释没有改变,只是发生和接口使用者无关的局部语义改变,不必发送更新消息。否则,将发生改变的概念的实例发送给接口的使用者模块。发生改变的概念如果在接口中有祖先概念,势必也会引起祖先概念实例的改变,但此时只发送最底层概念和它的实例,这是因为接口的TBOX知识能传播到使用者模块从而能够推理出祖先概念。由于接口的使用者模块的缓存对象是它的局部信息,接口的实现者模块并不知道该信息,无法判断发生语义改变的概念出现在哪些使用者模块的缓存中,所以知识更新消息将发给所有使用者模块。

发生改变的概念实例采用增量的模式发送,在消息中指出哪个概念增加(或减少)了哪些实例。只向相关模块定向发送和采用增量模式,可以减少通信量。使用者模块收到消息后,结合自身的知识和相关接口的TBOX,推理出发生改变的概念所有祖先概念,加上该概念自身得到一个概念集。由于接口中的TBOX知识已被加入到使用者模块的本地知识库,故这一步的推理是在本地进行的。如果该概念集中的所有概念均未在使用者模块的缓存中出现,使用者模块将丢弃收到的更新消息。如果在缓存的ABOX部分找到了概念集中的某个概念,则更新ABOX缓存知识。下一步是查找该概念集中的概念有无在缓存的TBOX部分中出现,假设该概念集中的某概念出现在缓存中一条形如A哿B的包含公理中,则分为下述几种情况决定该包含公理是否失效,对失效的公理将从缓存中删除。

1)A的实例减少或不变而B的实例不变或增加。这种情况下该条包含公理仍有效。

2)A的实例增加。这种情况下则首先查询缓存ABOX知识中有无概念B,若没有则要向概念B的实现者模块发送知识查询信息,得到概念B的实例集。令A1表示A增加实例的集合,如果A1哿B,则该条包含公理仍有效,否则该条包含公理失效。

3)B的实例减少。这种情况下则首先查询缓存ABOX知识中有无概念A,若没有则要向概念A的实现者模块发送知识查询信息,得到概念A的实例集。令B1表示B减少实例的集合,如果B1∩A=覫,则该条包含公理仍有效,否则该条包含公理失效。

如果实现者模块重新定义了一个概念,造成一个概念的实例大规模变化,使得发送概念增量实例可能比发送概念实例通信量更大,这种情况下也可以直接发送概念实例。由于使用者模块的缓存中可能没有该概念,为了减少通信量,在知识更新消息中仅发送该概念的名称和一个特殊标志指出当前工作在非增量模式。该概念和它的祖先概念构成一个概念集,如果该概念集的某个概念出现在使用者模块缓存中一条形如A哿B的包含公理中,则不论位置如何,都要重新判断该条包含公理的有效性。通过向相关实现者模块发起知识查询,得到A和B的实例集,再判断A哿B的有效性。非增量模式下缓存ABOX检查是类似的。

3 结束语

为了提高模块化本体推理的效率,本研究提出了模块化本体缓存方案,给出了缓存的对象和缓存一致性检查方法。进一步的研究是将该方案应用到具体的系统中并进行验证。

摘要:该文提出了一种模块化本体缓存方案,使用该方案能够缩短本体推理的平均时间。给出了缓存的对象和缓存一致性检查方法,通过中断方式和增量模式传递知识更新信息,能够减少通信量和提高更新的效率。

关键词:本体,模块化,缓存

参考文献

[1]Ensan F.Formalizing Ontology Modularization through the Notion of Interfaces[C].Acitrezza,Catania,Italy:Proc.of the16th International Conference on Knowledge Engineering and Knowledge Management,2008:74-82.

[2]Borgida A,Serafini L.Distributed Description Logics:Assimilating Information from Peer Sources[J].Journal of Data Semantics,2003,1(1):153-184.

网络缓存技术的应用研究 篇7

据业内权威统计, 2010年全球每月网络数据流量达到20EB;到2015年, 这个数值将达到81EB, 是5年前的4倍, 且其中61%为视频数据, 这预示着互联网洪水时代即将来临。一味的提高带宽从高额的带宽费用角度来考虑, 很多企业也承受不起。而很多企业利用流量控制软件虽然能缓解网络瘫痪的问题, 但是还是不能满足用户对网络下载高流量的需求。

当今互联网络的发展从2000~2005年的“互联互通”阶段 (保证基本的网页浏览、通信工具的使用、电子邮件的收发等简单的联通发展) 走向2005~2010年的“应用成长”阶段 (网络游戏的趋势型扩张、数字办公OA技术等多种网络软件的应用发展) , 直到2010~2015年的“注重体验”阶段 (包括视频体验、特别是移动通信设备的视频体验包括Ipad、Iphone等移动设备的网络视频体验需求) , 网络视频正以大容量、大规模的数据形式出现在网络流量中最耗费网络带宽的部分。这导致网络带宽的增长速度远远低于用户的需求, 网络建设的成本不堪重负。

为了缓解网络带宽的压力、应用网络数据的快速增长, 我们希望利用网络缓存技术在未来解决我们“网络体验”阶段所面临的难题。

二、网络缓存技术应用的几种方法

(一) 热点数据统计法。

通过对定期校园网内的下载数据资料进行统计分析发现这些数据中近45%~68%的部分是相同的数据内容, 我们把这部分相同的数据资料称为热点数据, 如果把热点数据保存至内网服务器, 用户需要下载这部分数据时直接从内网下载, 就可以有效地节省理论统计上的带宽了。我们可以看出网络缓存的性能跟热点数据的命中率成正比关系, 热点数据命中率越高, 网络缓存性能越高, 所以要提升缓存的性能就必须为缓存选择合适的算法来提高热点数据命中率。由于服务器可以保存的热点数据容量是有限的, 及时地更新热点数据使之最大效应化, 需要利用热点数据淘汰算法, 目前使用最多的有两种算法:最近最少访问算法 (Least Recently Used, LRU) , 这种算法连续地检测数据访问, 识别出长时间没有被访问到的热点数据。LRU直接释放掉这些数据或者标记它们为可重用。这种算法基于这样一种假设:如果一个热点数据已经很久没有被访问下载, 那么很可能以后它也不会被访问。最近访问算法 (Most Recently Used, MRU) , 这种算法与LRU相反。在MRU算法中, 最近被使用的热点数据将被释放或标记为可重用。这种算法基于的假设是:如果一个热点数据已经被下载过了, 那么在之后的一段时间内它可能不会再被访问。通过以上两种算法可以及时地淘汰和更新网络缓存中的热点数据。

(二) 主动缓存法。

在校园网的数据访问统计分析中, 我们发现其中占网络热点数据百分比最大的数据资料内容是电视网络视频资源, 这些文件通常容量较大, 下载所需时间较长, 多人在线观看视频会严重影响校园网络的带宽, 导致网络速度缓慢、甚至瘫痪。我们可以通过主动缓存的方式在夜间上网用户数量较少、热点服务器下载外网网络数据任务不重的时间段, 让网络缓存服务器主动下载一些访问量高的主流视频网站 (如优酷、迅雷、土豆等) 上的点击率高、排行榜靠前的热门电影、热门视频, 这样在白天用户访问的时候就可以直接从热点服务器上访问了, 从而缓解了校园网络带宽的压力和热点数据服务器的下载负担。

(三) 视频切片法。

前面我们提到, 很多用户在访问视频的时候可以从网络热点服务器上下载来节省带宽, 面对更多的用户数时, 完整地提供整部电影或视频也会对热点服务器造成带宽压力, 可是用户很多时候不能观看完一部完整的视频就会中止观看, 如果我们把网络中的视频A切成若干分片, 在用户访问的时候根据用户需要, 只下载当前用户所需的相应分片内容可以有效地节省带宽, 缓解热点服务器的压力。

(四) 网络缓存的内容更新。

如何保证热点服务器的数据和当前网络中的数据是一致的是网络缓存技术的重要一环, 也是确保数据一致性和及时性的要求。在每次有用户发出网络资源申请时, 热点数据服务器在检查自己包含用户所需的资源时, 会首先和外网服务器的资源进行数据比对 (对数据包包头进行数据检查) , 如果一致则由内网缓存服务器向用户提供资源, 如果不一致则首先由热点服务器从外网服务器下载所需资源进行更新后, 再向用户提供所申请的资源。

(五) 网络缓存的内容管理。

通过热点服务器备份网络资源。随着时间的迁移, 服务器的容量会达到饱和状态, 如何放入更新的资源替换哪些已经不会或很少被访问的数据资源是非热点资源清理的任务。非热点资源清理通过热点数据淘汰算法来实现, 它执行的条件是:当热点服务器硬盘容量达到既定阀值 (如85%) , 我们就要把热点最低、存放时间最久、最近下载次数最少的数据资源删除, 直至清理出5%的硬盘空间。

(六) 网络缓存的设备扩容。

我们可以对多台网络缓存设备进行扩容, 采用云模式进行部署, 以虚拟的方式从逻辑上形成一台网络缓存设备, 并进行负载均衡技术的加载使得数据可以通过多通道的形式进行传输, 缓解单线的网络数据流量压力。

三、结语

网络缓存技术是一个在未来有着重要研究价值的领域, 现在很多网络设备厂商都在积极地研究相应的网络缓存设备来迎接互联网的洪水时代, 用少量的资本投入就可以得到更稳定、高效的网络带宽, 是网络互联网时代的需求。本文针对网络缓存技术中对热点数据的提出, 通过自动缓存、视频切片、内容更新、非热点数据资源清理等方法提出了对未来网络缓存技术发展、缓存设备开发、网络缓存技术应用的新思路。

参考文献

[1].G.Somasundaram Alok Shrivastava.信息存储与管理[M].北京:人民邮电出版社, 2010

上一篇:支付结算效能下一篇:风道改造