发明内容
鉴于上述问题,本发明的目的在于提供一种面向WFS服务的空间查询结果缓存方法,旨在解决现有空间查询结果整体缓存效果差、命中率较低的技术问题。
本发明采用如下技术方案:
所述面向WFS服务的空间查询结果缓存方法包括下述步骤:
S1、构建一级缓存和二级缓存;其中一级缓存中保存有由查询条件生成的唯一标识Key、查询结果Value以及每条一级缓存对象所包含的二级缓存对象,其中二级缓存包括与数据库中每条记录唯一键对应的二级标识OID、数据库中单条记录对象化格式化的结果Object、以及每条二级缓存对象影响到的一级缓存对象;
S2、接收用户请求并判断请求类型;
S3、若用户请求为查询请求,根据查询条件得到查询Key值;
S4、判断一级缓存中是否存在所述查询Key值;
S5、若存在所述查询Key值,则直接从一级缓存中返回查询Key值对应的查询结果;
S6、若不存在所述查询Key值,则根据查询条件从数据库中得到查询结果记录以及相应的唯一键集合,即二级标识OID集合;
S7、将所述查询结果记录逐条对象化格式化,针对每条记录,如果二级缓存中不存在当前记录唯一键对应的二级标识OID,则按照二级缓存格式将当前记录生成二级缓存对象并加入到二级缓存中;
S8、根据得到的所述二级标识OID集合对应的二级缓存对象,生成一级缓存对象并加入到所述一级缓存中,并返回查询结果。
进一步的,所述方法还包括下述步骤:
S9、若用户请求为编辑请求,根据编辑请求指令操作数据库,并同步刷新缓存内容和状态,标记需要重新生成的一级缓存对象,删除失效的缓存。
进一步的,步骤S9中,所述编辑请求包括插入、更新和删除;
当接收到插入指令时,在数据库中插入对象并判断插入对象和所有一级缓存对象的空间范围索引是否相交,如果相交则一级缓存失效,删除一级缓存;
当接收到删除指令时,在数据库中删除对象同时删除对应的二级缓存对象,此时受删除的二级缓存对象影响的一级缓存对象被标记需要重新生成;
当接收到更新指令时,在数据库中更新对象,若更新对象包括空间信息编辑,则与更新对象相关的一级缓存全部失效并从一级缓存中删除,若更新对象仅为属性信息编辑,则更新对应的二级缓存对象,并标记影响到的一级缓存对象需要重新生成。
进一步的,步骤S5中,若一级缓存中存在所述查询Key值,判断一级缓存中所述查询Key值对应的一级缓存对象是否标记为需要重新生成,若不需要重新生成,则直接从一级缓存中返回查询Key值对应的查询结果,若需要重新生成,则根据包含的二级缓存对象生成一级缓存对象并加入到所述一级缓存中,并返回查询结果。
进一步的,步骤S3中,所述根据查询条件得到查询Key值具体为:将查询条件拼接成的字符串,反向后使用HashCode或MD5编码,得到查询Key值。
本发明的有益效果是:本发明结合WFS服务请求方式与结果的特征,提供了一种面向WFS服务的空间查询结果缓存方法,该方法建立空间数据分级缓存,一级缓存为粗粒度,二级缓存为细粒度,并维护分级缓存之间的关系;一级缓存由二级缓存生成,避免全部重新从数据库生成。本方法实现缓存的局部更新,减少重复构建缓存对象,提升缓存生成的效率和命中率,以解决WFS服务空间查询结果输出效率低的问题。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
WFS服务主要使用空间范围进行查询,数据缓存的常见方式是将整个查询结果直接保存到缓存中,以提高WFS服务查询结果数据的加载速度,一般情况下这种缓存结果是根据请求参数作为唯一标识,除非请求参数一致,否则这种整体缓存的结果很难复用,而且当用户更新了数据库中的数据,将导致存在大量污染或失效缓存,缓存正确率或命中率急剧下降。本发明尽量复用缓存,实时同步缓存,减少污染缓存,提高缓存的命中率。空间数据查询结果分级缓存的方式有效减少重复对象化和格式化过程,提高了缓存的利用率,压缩查询结果输出的响应时间。为了说明本发明所述的技术方案,下面通过具体实施例来进行说明。
图1示出了本发明实施例提供的面向WFS服务的空间查询结果缓存方法的流程,为了便于说明仅示出了与本发明实施例相关的部分。
如图1所示,本发明方法包括如下步骤:
步骤S1、构建一级缓存和二级缓存;其中一级缓存中保存有由查询条件生成的唯一标识Key、查询结果Value以及每条一级缓存对象所包含的二级缓存对象,其中二级缓存包括与数据库中每条记录唯一键对应的二级标识OID、数据库中单条记录对象化格式化的结果Object、以及每条二级缓存对象影响到的一级缓存对象。
一级缓存和二级缓存的结构示意如图2所示,本发明将空间数据的缓存分为二级,一级缓存为粗粒度,对应查询结果的整体输出;二级缓存为细粒度,对应查询的单个记录对象,与数据库每条记录同等粒度。二级缓存与数据库记录对应,并保持与数据库的同步。本发明缓存机制需要维护一级缓存和二级缓存之间的关系,当一级缓存需要重新生成时,由二级缓存直接生成;二级缓存失效时,由数据库中原始数据生成,并及时更新影响到的一级缓存对象。
图2中,一级缓存的唯一标识Key(如Key1,Key2,Key3…)是由查询条件生成,Value中保存的是对应的查询结果,可用于直接输出,一级缓存中还存储了与二级缓存的关系,即一级缓存对象由哪些二级缓存对象构成,如Key1由标识为OID1、OID5的二级缓存对象集合构成。二级缓存的二级标识OID与数据库中每条记录的唯一键保持一致,Object(如Object1,Object2,Object3…)是数据库中单条记录对象化格式化的结果,并同时记录该二级缓存对象影响到的一级缓存对象,如OID1影响到Key值为Key1、Key3的一级缓存对象。
当一级缓存生成时,先从数据库查询获取查询结果的唯一键集合,即二级缓存的OID集合,然后根据OID合并二级缓存的Object生成一级缓存的Value;当一级缓存被标记需要重新生成时,由记录的二级缓存OID包含关系可以直接生成一级缓存,不需从数据库查询。
步骤S2、接收用户请求并判断请求类型。
用户请求的请求类型有查询请求和编辑请求。
查询请求来自于WFS服务的GetFeature接口,GetFeature接口规定了如何访问空间数据,可以通过空间范围查询、属性查询及空间范围与属性结合的查询,根据用户场景和服务请求的频率,WFS服务查询的压力主要来自涉及空间范围的查询。
编辑请求来自于WFS服务的Transaction接口,Transaction接口提供了Insert、Update、Delete方法来更新数据库中的数据。
S3、若用户请求为查询请求,根据查询条件得到查询Key值。
当用户请求来自于GetFeature接口,该请求为查询请求,根据具体的查询条件可以得到查询Key值。具体的,将查询条件(通常为SQL语句)拼接成的字符串,反向后使用HashCode(或MD5)编码,生成得到查询Key值。
S4、判断一级缓存中是否存在所述查询Key值。
S5、若存在所述查询Key值,则直接从一级缓存中返回查询Key值对应的查询结果。
如果一级缓存的唯一标识中存在所述查询Key值,则直接调用查询Ke值对应的查询结果Value。
S6、若不存在所述查询Key值,则根据查询条件从数据库中得到查询结果记录以及相应的唯一键集合,即二级标识OID集合。
如果一级缓存的唯一标识中不存在所述查询Key值,那么需要根据查询条件从数据库中进行查询,然后得到查询结果记录。根据每条记录的唯一键,得到OID集合。
S7、将所述查询结果记录逐条对象化格式化,针对每条记录,如果二级缓存中不存在当前记录唯一键对应的二级标识OID,则按照二级缓存格式将当前记录生成二级缓存对象并加入到二级缓存中。
查询结果记录中,需要对每条记录对象化和格式化,此过程中,每条记录还要判断二级缓存中是否存在当前记录的唯一键对应的OID,如果不存在,那么还需要将当前记录按照二级缓存的格式生成二级缓存对象并加入到二级缓存中,以保证二级缓存中存在所有查询结果记录对应的OID。
S8、根据得到的所述二级标识OID集合对应的二级缓存对象,生成一级缓存对象并加入到所述一级缓存中,并返回查询结果。
在步骤S6中已经得到了查询结果记录的OID集合,根据OID集合对应的二级缓存对象,生成一级缓存对象并加入到所述一级缓存中。具体的,将查询Key值作为一级缓存对象的Key,假设所述OID集合包括OID1、OID7、OID10,根据所述OID集合中的每个OID,结合二级缓存的Object1、Object7、Object10,生成对应一级缓存对象的Value值,假设为Value_k,因此最终生成的一级缓存对象为(查询Key值,Value_k,OID1/OID7/OID10)。Value_k是其包含的二级缓存的整体集合,从结果输出的角度来说,Value_k是Object1、Object7、Object10格式化内容的拼接。最后返回查询结果Value_k。
进一步的,本发明方法还包括下述步骤:
步骤S9、若用户请求为编辑请求,根据编辑请求指令操作数据库,并同步刷新缓存内容和状态,标记需要重新生成的一级缓存对象,删除失效的缓存。
若用户请求来自于Transaction接口,则该用户请求为编辑请求。根据具体的编辑请求指令操作数据库,包括插入、删除、更新等。同时需要刷新一级缓存和二级缓存的内容和状态,并标记需要重新生成的一级缓存对象,还要删除失效的缓存对象。WFS服务的查询结果缓存失效主要是通过数据库改变来驱动,即当数据库更新(包括Insert、Update、Delete等)的同时刷新缓存,这种方式主要支持空间范围查询、空间范围与属性结合的查询(属性可以看作查询结果的过滤条件)。由于属性查询的特殊性,WFS服务的查询结果缓存过期策略也应考虑到使用时间的限制,超过时间限制的缓存失效,此策略针对只有属性过滤条件的查询。属性查询结果的缓存可以设定时间,在规定的时间限制内(如60秒)有效,超过了限定时间则缓存失效。使用二级缓存生成一级缓存,避免了每次查询重复对象化和格式化单条记录对象,提高了缓存生成和更新的效率。
对于具体的操作指令:
当接收到插入指令时,在数据库中插入对象并判断插入对象和所有一级缓存对象的空间范围索引是否相交,如果相交则一级缓存失效,删除一级缓存;
当接收到删除指令时,在数据库中删除对象同时删除对应的二级缓存对象,此时受删除的二级缓存对象影响的一级缓存对象被标记需要重新生成;
当接收到更新指令时,在数据库中更新对象,若更新对象包括空间信息编辑,则与更新对象相关的一级缓存全部失效并从一级缓存中删除,若更新对象仅为属性信息编辑,则更新对应的二级缓存对象,并标记影响到的一级缓存对象需要重新生成。
本步骤提供了缓存同步机制,当数据库中有新记录插入时,即接收到插入指令时,判断插入对象和所有一级缓存对象的空间范围索引是否相交,如果相交则一级缓存对象失效,并从一级缓存中删除。如果数据库有记录被删除时,即接收到删除指令时,直接删除细粒度的二级缓存对象,此时受影响的一级缓存标记需要重新生成,即在下一次访问缓存时由二级缓存生成,由二级缓存局部更新实现一级缓存异步更新。当数据库有记录被更新时,即接收到更新指令时,判断空间信息是否被编辑,如果空间信息内容被修改,则涉及到更新对象的一级缓存对象全部失效,并从一级缓存中删除;如果只有属性信息被编辑,则更新对应的二级缓存对象,并标记影响到的一级缓存需要被重新生成。
在缓存同步机制中,删除二级缓存对象时,受影响的一级缓存标记需要重新生成,即在下一次访问一级缓存对象时由二级缓存生成,由二级缓存局部更新实现一级缓存异步更新。因此在上述步骤S5中,还需要进一步判断一级缓存对象是否标记为需要重新生成。具体的,如图3所示,包括下述步骤:
S51、若一级缓存中存在所述查询Key值,判断一级缓存中所述查询Key值对应的一级缓存对象是否标记为需要重新生成;
S52、若不需要重新生成,则直接从一级缓存中返回查询Key值对应的查询结果;
S53、若需要重新生成,则根据包含的二级缓存对象生成一级缓存对象并加入到所述一级缓存中,并返回查询结果。
本方案中,当一级缓存对象被标记需要重新生成时,由记录的二级缓存OID包含关系可以直接生成一级缓存,不需从数据库查询。
综上,本发明结合数据缓存技术,提供了一种面向WFS服务的空间查询结果的高效缓存方案,以解决服务输出结果性能较低的问题。本发明提出的建立空间数据分级缓存方法,有效减少了重复的对象化和格式化,实现了缓存的局部更新,提高了缓存复用率和生成速率。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。