顾及访问热度的网络空间信息服务高性能内存缓存方法
技术领域
本发明涉及网络地理信息***技术,尤其是一种顾及访问热度的网络空间信息服务高性能内存缓存方法。
背景技术
网络空间信息服务高性能内存缓存是网络地理信息***(WebGIS)中需要解决的重要问题之一,利用服务器内存的高性能并发读写性能,将网络空间信息服务请求数据缓存到服务器的高速内存中,能够提高客户端请求的并发响应效率,但服务器的内存资源是有限的,对于大规模的海量空间数据,只能缓存部分数据到服务器的内存中,当大用户量密集并发访问时,由于大量临时访问数据被加入到有限的内存缓存中,会导致频繁地对内存缓存中的数据进行淘汰处理,降低了内存缓存的效率和缓存命中率。
发明内容
本发明要解决的技术问题在于针对现有技术中的缺陷,提供一种顾及访问热度的网络空间信息服务高性能内存缓存方法,降低服务器上内存缓存的淘汰频率,提高网络空间信息服务内存缓存性能。
本发明解决其技术问题所采用的技术方案是:一种顾及访问热度的网络空间信息服务高性能内存缓存方法,其包括以下步骤:
步骤1:设置服务器端的空间数据请求次数缓存阈值(ACT),全局内存缓存对象最大个数(GCT),临时缓存对象最大个数(TCT)。
步骤2:服务器端接收客户端发送的空间数据请求,获得请求的访问地址。
步骤3:将地址作为关键字从全局内存缓存中去检索缓存对象,如果全局缓存命中,转步骤4;如果全局内存缓存没命中,转步骤6。
步骤4:更新命中的全局内存缓存对象的最后访问时间属性。
步骤5:将命中的缓存对象中存储的结果数据直接返回给客户端,结束。
步骤6:从空间数据库中检索客户端请求的数据。
步骤7:将结果数据返回给客户端。
步骤8:将客户端请求地址作为关键字从临时缓存中检索对应的临时缓存对象,如果临时缓存命中,转步骤9;如果临时缓存未命中,转步骤15。
步骤9:获取临时缓存对象的访问次数(RAC)。如果RAC>ACT,转步骤10;反之则转步骤14。
步骤10:将当前请求得到的结果数据增加到全局内存缓存中。
步骤11:删除当前请求的临时缓存对象,
步骤12:获取全局内存缓存中的缓存个数(GCC),如果GCC>GCT,转步骤13,如果GCC<GCT,结束。
步骤13:删除全局内存缓存中最久未被访问的一个缓存对象,结束。
步骤14:将临时缓存对象的访问次数(RAC)加1,并更新临时缓存对象的最后访问时间,结束。
步骤15:将当前请求的临时缓存对象的访问次数初始为1,并将其增加到临时缓存中。
步骤16:获取临时缓存中的缓存对象个数(TCC),如果TCC>TCT,转步骤17;如果TCC<TCT,结束。
步骤17:删除临时缓存中最久未被访问的一个缓存对象,结束。
按上述方案,所述步骤1)中临时缓存和全局缓存都采用键值对的形式存储,其中,键均为请求的地址,值分别为临时缓存对象和全局缓存对象。
按上述方案,所述每个临时缓存对象的值中包括其键对应的请求地址的最后访问时间和对该地址的访问次数;所述每个全局缓存对象的值中包括其键对应的请求地址的最后访问时间和该请求对应的结果数据。
按上述方案,所述步骤9)中,仅当请求地址的访问次数超过阈值时才将请求地址对应的结果数据缓存到全局缓存中。
本发明的有益效果是能够根据网络空间信息服务访问请求的访问热度来判断是否将请求数据缓存到服务器的内存缓存中,以避免将一些临时访问次数较少的数据存储到服务器的内存缓存中,减少服务器内存缓存的转换次数,提高服务器端内存缓存效率和缓存命中率,提高网络空间信息服务的大用户量并发请求处理性能。
附图说明
下面将结合附图及实施例对本发明作进一步说明,附图中:
图1是本发明的方法流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
如图1所示,图1是本发明提供的顾及访问热度的网络空间信息服务高性能内存缓存方法流程图,所述方法包括以下步骤:
步骤1:设置服务器端的空间数据请求次数缓存阈值(ACT),全局内存缓存对象最大个数(GCT),临时缓存对象最大个数(TCT)。
步骤2:服务器端接收客户端发送的空间数据请求,获得请求访问的HTTP地址。
步骤3:将地址作为关键字从全局内存缓存中去检索缓存对象,如果全局缓存命中,转步骤4;如果全局内存缓存没命中,转步骤6。
全局缓存对象使用键值对的形式存储,请求访问的HTTP地址作为键,值为一个全局缓存对象类(GlobalCacheItem),其包含请求的结果数据(data)和请求的最后访问时间(lastAccessTime)。全局缓存对象类定义如下:
Public class GlobalCacheItem
{
Public byte[] data;
Public DateTime lastAccessTime;
}
步骤4:获取命中的全局内存缓存对象(globalCacheObj),更新globalCacheObj的最后访问时间(lastAccessTime)属性,将其更新为当前时间。
步骤5:将命中的缓存对象中存储的结果数据(globalCacheObj.data)直接返回给客户端,结束。
步骤6:从空间数据库中检索客户端请求的数据。
步骤7:将结果数据返回给客户端。
步骤8:将客户端请求地址作为关键字从临时缓存中检索对应的临时缓存对象,如果临时缓存命中,转步骤9;如果临时缓存未命中,转步骤15。
临时缓存对象使用键值对的形式存储,请求访问的HTTP地址作为键,值为一个临时缓存对象类(TempCacheItem),其包含请求的访问次数(RAC)和请求的最后访问时间(lastAccessTime)。临时缓存对象类定义如下:
Public class TempCacheItem
{
Public int RAC;
Public DateTime lastAccessTime;
}
步骤9:获取命中的临时缓存对象(tempCacheObj),获取临时缓存对象的访问次数(tempCacheObj.RAC)。如果tempCacheObj.RAC>ACT,转步骤10;反之则转步骤14。
步骤10:将步骤6中得到的当前请求的结果数据增加到全局内存缓存中。
步骤11:删除当前请求的临时缓存对象(tempCacheObj),
步骤12:获取全局内存缓存中的缓存个数(GCC),如果GCC>GCT,转步骤13,如果GCC<GCT,结束。
步骤13:根据全局内存缓存中各个缓存对象的最后访问时间属性(lastAccessTime),删除全局内存缓存中最久未被访问的一个缓存对象,结束。
步骤14:将临时缓存对象的访问次数(tempCacheObj.RAC)加1,并更新临时缓存对象的最后访问时间(tempCacheObj.lastAccessTime),结束。
步骤15:为当前请求新建一个临时缓存对象,将当前请求的临时缓存对象的访问次数(RAC)初始为1,最后访问时间(lastAccessTime)初始为当前时间,并将其增加到临时缓存中。
步骤16:获取临时缓存中的缓存对象个数(TCC),如果TCC>TCT,转步骤17;如果TCC<TCT,结束。
步骤17:根据临时缓存中各个缓存对象的最后访问时间属性(lastAccessTime),删除临时缓存中最久未被访问的一个缓存对象,结束。
本发明最明显的不同在于增加了临时缓存模块,当服务器接收到大用户量并发访问请求时,不直接将新的请求的结果数据增加到全局内存缓存中,而仅将请求的访问次数和最后访问时间存储到临时缓存中,当访问次数超过预设的阈值时才将请求的结果数据缓存到全局内存缓存中。此方法能够避免临时访问次数较少的数据被存储到全局内存缓存中,减少全局内存缓存的置换频率,提高全局内存缓存效率和命中率,提高网络空间信息服务的并发处理性能,尤其是在服务器内存资源较少时,该方法的优势更加明显。
实施例一:
为了更清晰的说明本发明的思想,下面对顾及访问热度的网络空间信息服务高性能内存缓存方法进行进一步的说明,以网络空间信息服务中的OGC
WMS服务的GetCapabilities请求为例,空间数据请求次数缓存阈值设置为10,全局内存缓存对象最大个数设置为10000,临时缓存对象最大个数设置为100。具体步骤如下:
步骤1:设置服务器端的空间数据请求次数缓存阈值(ACT=10),全局内存缓存对象最大个数(GCT=10000),临时缓存对象最大个数(TCT=100)。
步骤2:服务器端接收客户端发送的WMS服务的GetCapabilities请求,获得GetCapabilities请求访问的HTTP地址,请求地址格式如下:
http://domain/wms?REQUEST=GetCapabilities&VERSION=1.1.1&SERVICE=WMS
步骤3:将步骤2中获得的地址作为关键字从全局内存缓存中去检索缓存对象,如果全局缓存命中,转步骤4;如果全局内存缓存没命中,转步骤6。
步骤4:获取命中的全局内存缓存对象(globalCacheObj),更新globalCacheObj的最后访问时间(lastAccessTime)属性,将其更新为当前时间。
步骤5:将命中的缓存对象中存储的结果数据(globalCacheObj.data)直接返回给客户端,结束。
步骤6:从空间数据库中检索客户端请求的数据,按照WMS服务的接口规范生成符合GetCapabilities服务接口要求的结果数据。
步骤7:将结果数据返回给客户端。
步骤8:将客户端请求地址作为关键字从临时缓存中检索对应的临时缓存对象,如果临时缓存命中,转步骤9;如果临时缓存未命中,转步骤15。
步骤9:获取命中的临时缓存对象(tempCacheObj),获取临时缓存对象的访问次数(tempCacheObj.RAC)。如果tempCacheObj.RAC>10,转步骤10;反之则转步骤14。
步骤10:使用步骤2中获得的客户端请求地址作为键,创建一个新的GlobalCacheItem类的实例对象(globalItem),设置其lastAccessTime属性为当前时间,并设置为data属性为步骤6中得到的当前请求的结果数据,然后将该请求的全局缓存对象globalItem增加到全局内存缓存中。
步骤11:删除当前请求的临时缓存对象(tempCacheObj),
步骤12:获取全局内存缓存中的缓存个数(GCC),如果GCC>10000,转步骤13,如果GCC<10000,结束。
步骤13:根据全局内存缓存中各个缓存对象的最后访问时间属性(lastAccessTime),删除全局内存缓存中最久未被访问的一个缓存对象,结束。
步骤14:将临时缓存对象的访问次数(tempCacheObj.RAC)加1,并更新临时缓存对象的最后访问时间(tempCacheObj.lastAccessTime)为当前时间,结束。
步骤15:为当前请求新建一个TempCacheItem类的实例对象(tempItem),将其访问次数(RAC)初始为1,最后访问时间(lastAccessTime)初始为当前时间,使用步骤2中获得的客户端请求地址作为键,将该请求的临时缓存对象tempItem增加到临时缓存中。
步骤16:获取临时缓存中的缓存对象个数(TCC),如果TCC>100,转步骤17;如果TCC<100,结束。
步骤17:根据临时缓存中各个缓存对象的最后访问时间属性(lastAccessTime),删除临时缓存中最久未被访问的一个缓存对象,结束。
采用本发明设计的顾及访问热度的网络空间信息服务高性能内存缓存方法,在服务器端接收大用户量的并发访问请求时,能够避免临时访问的请求数据过多地加入到全局内存缓存中,有效地减少全局内存缓存的置换次数,有助于提高全局内存缓存的效率和命中率,提升大用户量密集并发访问时网络空间信息服务的并发处理性能。
应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应属于本发明所附权利要求的保护范围。