一种提高搜索信息速度的方法及系统的制作方法

文档序号:6649310阅读:186来源:国知局
专利名称:一种提高搜索信息速度的方法及系统的制作方法
技术领域
本发明涉及计算机及通信技术领域,尤其涉及一种提高搜索信息速度的方法及系统。
背景技术
目前对象缓存架构大都使用Java实现,开源的项目主要有Jive、OSCache、Java Caching System、EHCache、ShiftOne、SwarmCache、TreeCache/JBossCache、WhirlyCache。
Jive是一个开放的Java源代码项目。Jive缓存信息为把所要缓存的对象加到哈希映射表HashMap中,用两个双向链表分别维持着缓存对象和每个缓存对象的生命周期。如果一个缓存对象被访问到,那么就把它放到链表的最前面,然后不定时地把要缓存的对象加入链表中,把过期对象删除,如此反复。
由于Java是使用虚拟机动态分配和回收内存,执行效率不高,而且大都为网站系统而设计,不太适用于对性能要求很高的搜索系统。

发明内容
本发明提供一种提高搜索信息速度的方法及系统,以解决现有技术在搜索信息时存在效率低的问题。
本发明提供以下技术方案一种存储信息的方法,包括如下步骤将与信息相关的关键词生成哈希值;从预先设定的数组中分配一个空闲的下标值,该数组中的各元素用于标识数组内存池中的一个存储单元;在哈希表中建立所述哈希值与下标值间的映射关系,并将与所述关键词相关的信息存储到所述下标值确定的数组元素在所述数组内存池中标识的存储单元内,使通过所述哈希值能够索引到存储单元中的信息。
其中根据所有已存储信息的存储单元对应的数组元素的下标值形成最近最少使用链表,链表头对应最近最常使用的存储单元的下标值,链表尾对应最近最少使用的存储单元的下标值。
分配空闲存储单元存储信息时,或使用所述最近最少使用链表中的节点所对应的存储单元内的信息时,将该存储单元对应的节点添加或移动到链表头。
当需要释放存储单元时,从所述最近最少使用链表的尾部取出节点值并重置对应的存储单元,以及从所述密集哈希表中删除对应的哈希值和下标值的对应关系。
根据所有空闲的存储单元对应的数组元素的下标值形成空闲链表;当分配存储单元时从该空闲链表中取出头节点,当最近最少使用链表中释放存储单元的下标值时,在该空闲链表的尾部添加该下标值。
所述哈希表为密集型哈希表。
一种提高搜索信息速度的方法,包括如下步骤A、根据搜索请求,将用于搜索信息的关键词生成哈希值;B、利用所述哈希值查询用于索引缓存的搜索结果信息的哈希表,判断是否缓存有该关键词的搜索结果信息;若是,则进行步骤C、D,否则,进行步骤E、F;C、从所述哈希表中获得所述哈希值所对应的数值,并将该数值作为用于标识数组内存池中的存储单元的数组的下标值;D、从所述下标值确定的数组元素在所述数组内存池中所标识的存储单元内读取搜索结果信息,将该信息返回给请求方;E、由搜索引擎利用所述关键词进行搜索,获得的搜索结果信息;F、分配一个空闲的数组下标值,在型哈希表中建立所述哈希值与下标值间的映射关系,将所述搜索结果信息存储到该下标值确定的数组元素在所述数组内存池中标识的存储单元内,并将搜索结果信息返回给请求方。
其中根据所有已存储搜索结果信息的存储单元形成最近最少使用链表,链表中的每个节点关联一个已缓存搜索结果信息的存储单元,其中,链表头对应最近最常使用的存储单元的下标值,链表尾对应最近最少使用的存储单元的下标值。
分配存储单元存储搜索结果信息时,或所述最近最少使用链表中的节点所对应的存储单元内的搜索结果信息被使用时,将该存储单元对应的节点添加或移动到链表头。
当需要释放存储单元时,从所述最近最少使用链表的尾部取出节点并重置对应的存储单元,以及从所述哈希表中删除对应的哈希值和下标值的对应关系。
根据所有空闲的存储单元形成空闲链表,该链表中的每个节点对应数组内存池中的一个存储单元;当分配存储单元存储搜索结果信息时从该空闲链表中取出头节点,当最近最少使用链表中释放存储单元的下标值时,在该空闲链表的尾部添加该下标值。
从存储单元读取搜索结果信息时,还对该搜索结果信息进行有效性检查,并根据检查结果按下述情况分别处理若确定所述搜索结果信息的已保存时间在配置的信息有效时间内,则将搜索结果信息返回给请求方;若确定所述搜索结果信息的已保存时间大于配置的信息有效时间并且小于最大生命周期时间,则在读取该搜索结果信息后释放该存储单元,并利用所述关键词重搜索信息并缓存;若确定所述搜索结果信息的已保存时间不小于配置的最大生命周期时间,则释放存储单元,利用所述关键词重搜索信息,并将搜索结果提供给请求方并缓存。
所述哈希表为密集型哈希表。
一种缓存系统,包括数组内存池,包含多个存储单元,用于缓存信息;哈希值生成模块,用于将与信息相关的关键词生成哈希值;哈希表,用于保存哈希值与数组中元素的下标识值之间的映射关系;管理模块,用于管理所述数组内存池中的已存储信息的存储单元和空闲的存储单元;保存信息模块,将信息存储到所述存储单元,并在所述哈希表中建立关键词的哈希值与该存储单元对应的数组元素下标值之间的映射关系。
一种搜索系统,包括数组内存池,包含多个存储单元,用于缓存信息;哈希值生成模块,用于将搜索关键词生成哈希值;哈希表,用于保存哈希值与数组中元素的下标识值之间的映射关系,以及根据所述哈希值进行查询并提供查询结果;管理模块,用于管理所述数组内存池中的存储单元,将哈希值提供给所述哈希表和根据哈希表的查询结果判断是否缓存有所述关键词的搜索结果信息,以及将搜索结果信息返回给请求方;搜索引擎,用于在所述管理模块确定未缓存有搜索结果信息时,利用所述关键词搜索信息,并返回给管理模块;信息存取模块,用于在所述查询模块确定缓存有搜索结果信息时,从所述下标值确定的数组元素在数组内存池中所标识的存储单元内读取搜索结果信息;或者,将搜索引擎搜索的结果信息存储到所述存储单元,以及在所述哈希表中建立关键词的哈希值与该存储单元对应的数组元素下标值的映射关系。
本发明具有以下有益效果1、本发明在哈希表中使用需要查询的关键词的散列值作为关键(key)值,存储单元所在的内存池数组下标值作为哈希表key值的对应值(value),能够实现从查询关键字到数组内存池索引值的快速定位和降低系统的负载,同时还能提高对查询和存储请求的并发处理能力。
2、由于密集型哈希表是一个使用C数组作为内部存储结构的哈希表,这样的存储结构与标准哈希表相比可以带来近50%的速度提升,因此,本发明采用密集型哈希表索引缓存信息,能够大幅度提高系统搜索的响应速度。
3、本发明中数组和对应存储单元采用静态配置,因此,还可降低动态分配所带来的损耗。


图1为本发明中存储信息的关系示意图;图2为本发明中存储信息的流程图;图3为本发明搜索信息的流程;图4为本发明中缓存系统的结构示意图;图5为本发明中搜索系统的结构示意图。
具体实施例方式
为了提高搜索信息的效率,本发明利用数组内存池缓存搜索结果信息,利用哈希表作索引。当需要搜索时先通过哈希表查询是否缓存有相应的搜索结果信息,若有则直接读取,若无则进行搜索,并将搜索后的搜索结果信息返回给请求方和缓存该搜索结果信息。本发明中的存储关系如图1所示。
数组内存池是由缓存对象构成的数组,数组内存池包括多个用于存储信息的存储单元(或称元素),数组中的每个数组元素标识一个存储单元。每个存储单元还包含有用于辅助管理的信息,这些包括建立时间、缓存信息和前后索引信息等。该内存池是在程序启动时根据配置分配固定的内存,以降低动态分配所带来的损耗。
为了提供效率,最佳方式是使用密集型哈希表。密集型哈希表是一个使用C数组作为内部存储结构的哈希表,这样的存储结构与标准哈希表相比可以带来近50%的速度提升。哈希表中使用需要查询的关键词的散列值作为它的key值,而查询结果所在的内存池数组下标值作为哈希表key值的对应value,实现从查询关键字到数组内存池索引值的快速定位。可以通过MD5算法将关键词生成哈希值(散列值)。
最近最少使用列表(LRU list)为双向链表结构,用于管理内存池,链表节点存储的是数组内存池的数组下标值,即每一个节点对应一个存储单元。链表头为最近最常使用(MRU)端,链表尾为最近最少使用(LRU)端。每当一个缓冲区被引用时,将该节点置于链表的MRU端,若数组内存池中没有空闲的缓冲区可用是释放LRU端的节点。
空闲列表(Free list)为普通的链表,系统初始化时将数组内存池的索引值(即数组下标值)都放置在该链表中,当需要保存新的查询结果时,它从空闲链表的头部摘出一个缓冲区,同时将该缓冲区加到LRU list的MRU端。当数组内存池没有空闲缓冲区可用时,则从LRU list释放LRU节点到free list中。
数组内存池的数组元素个数根据需要存储的信息量决定设置,该值是静态配置,在程序运行期间不能修改。初始化时,数组内存池中缓存单元没有前/后向元素(如其初始值为-1),最近最少使用列表(LRU list)中没有元素,而所有的数组下标值均保存在空闲列表(Free list)中。
参阅图2所示,在搜索系统中,采用以上方式缓存搜索结果信息的主要流程如下步骤100、利用MD5算法将需要搜索信息的关键词生成哈希值;该值为一个128位的串。
步骤110、从空闲列表(Free list)中分配一个未使用的数组下标值。
步骤120、在密集哈希表中建立哈希值与数组下标值之间的映射关系。
步骤130、将需要保存的信息存储到所述下标值在数组确定的元素所对应的缓存单元内。
步骤140、在最近最少使用列表(LRU list)中的MRU端增加节点,并将所述下标值保存在该节点中。
上述方法不仅局限于存储搜索结果信息,可以用于保存与关键词相关的其他任何信息。
参阅图3所示,在搜索系统中,采用上述方式搜索和缓存信息的主要处理过程如下步骤200、接收搜索请求,并将用于搜索信息的关键词生成哈希值,如该值为一个128位的串。
步骤210、利用所述哈希值查询用于索引缓存的搜索结果信息的密集型哈希表,判断是否缓存有该关键词的搜索结果信息;若是,则进行步骤220;否则,进行步骤250。
步骤220、利用所述哈希值查询密集型哈希表,获得所述哈希值所对应的数组元素的下标值。
步骤230、根据所述下标值在数组中确定的数组元素,定位到该数组元素所标识的数组内存池中的存储单元。
步骤240、从所述存储单元读取搜索结果信息并提供给请求方。
步骤250、根据所述存储单元的下标值,将最近最少使用列表(LRU list)中对应的节点移动到的MRU端。
步骤260、将所述关键词传送给搜索引擎,由搜索引擎获得的搜索结果信息。
步骤270、从空闲列表(Free list)中分配一个空闲的数组元素的下标值。
步骤290、在密集哈希表中建立哈希值与数组下标值之间的映射关系。
步骤300、将搜索到的结果信息存储到所述下标值在数组确定的元素所对应的缓存单元内,并将搜索结果信息返回给请求方。
步骤310、在最近最少使用列表(LRU list)中的MRU端增加节点,并将所述下标值保存在该节点中,使该节点对应所述存储单元。
为了保证缓存信息的新鲜度,还可在将缓存数据返回给客户端前要对其进行有效性检测,如果缓存数据已失效则必须重新查询和缓存。其具体方式是在从数组内存的存储单元读取数据时,根据用户配置的有效时间(ExpireTime)和MaxLifeTime(最大生命周期)判断当前的查询时间与该缓存结果创建时间差值落在哪个时间段内。若时间差小于ExpireTime则从内存池中取出缓存结果返回给客户端;如果时间差大于等于ExpireTime而小于MaxLifeTime时先将缓存结果返回给客户端,然后释放该缓存元素节点,包括完成从密集型哈希表中删除映射关系、从LRU链表中删除该节点和追加至空闲链表尾等一系列操作;然后由搜索引擎利用关键词进行搜索,并将结果重新保存至内存池中,但此时不再返回给客户端,以此保证缓存内容的新鲜度;若时间差值大于MaxLifeTime则马上释放该缓存元素节点,接着按没有缓存结果的处理过程处理该查询请求。
对于数组内存中已存储数据的存储单元,并不限于采用上述的链表结构进行管理,也可以对数组缓存池中保存的每一个对象进行引用计数及最近查询时间,当该缓冲区被引用的次数达到一定值后重新查询并保存查询结果,而释放很久都没有再进行引用的缓冲区。
相应的,一种缓存系统如图4所示,该系统包括数组内存池,包含多个存储单元,用于缓存信息。
哈希值生成模块,用于将与信息相关的关键词生成哈希值;哈希表,利用散列算法(如MD5)将与信息相关的关键词生成哈希值。
管理模块,与哈希值生成模块和哈希表具有逻辑上的连接关系,用于管理所述数组内存池中的已存储信息的存储单元和空闲的存储单元。较佳的方式是,管理模块通过双向链表管理存储单元。
保存信息模块,与所述数组内存池和管理模块具有逻辑上的连接关系,用于将信息存储到所述存储单元,并在所述哈希表中建立关键词的哈希值与该存储单元对应的数组元素下标值之间的映射关系。
相应的,一种搜索系统如图5所示,该系统包括数组内存池,包含多个存储单元,用于缓存信息。
哈希值生成模块,用于将搜索关键词生成哈希值。
哈希表,用于保存哈希值与数组中元素的下标识值之间的映射关系,以及根据所述哈希值进行查询并提供查询结果。
管理模块,与哈希值生成模块和哈希表具有逻辑上的连接关系,用于管理所述数组内存池中的存储单元,将哈希值提供给所述哈希表和根据哈希表的查询结果判断是否缓存有所述关键词的搜索结果信息,以及将搜索结果信息返回给请求方。
搜索引擎,与所述管理模块具有逻辑上的连接关系,用于在所述管理模块确定未缓存有搜索结果信息时,利用所述关键词搜索信息,并返回给管理模块。
信息存取模块,与所述管理模块和数组内存池具有逻辑上的连接关系,用于在所述查询模块确定缓存有搜索结果信息时,从所述下标值确定的数组元素在数组内存池中所标识的存储单元内读取搜索结果信息;或者,将搜索引擎搜索的结果信息存储到所述存储单元,以及在所述哈希表中建立关键词的哈希值与该存储单元对应的数组元素下标值的映射关系。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若对本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
权利要求
1.一种存储信息的方法,其特征在于,包括如下步骤将与信息相关的关键词生成哈希值;从预先设定的数组中分配一个空闲的下标值,该数组中的各元素用于标识数组内存池中的一个存储单元;在哈希表中建立所述哈希值与下标值间的映射关系,并将与所述关键词相关的信息存储到所述下标值确定的数组元素在所述数组内存池中标识的存储单元内,使通过所述哈希值能够索引到存储单元中的信息。
2.如权利要求1所述的方法,其特征在于,根据所有已存储信息的存储单元对应的数组元素的下标值形成最近最少使用链表,链表头对应最近最常使用的存储单元的下标值,链表尾对应最近最少使用的存储单元的下标值。
3.如权利要求2所述的方法,其特征在于,分配空闲存储单元存储信息时,或使用所述最近最少使用链表中的节点所对应的存储单元内的信息时,将该存储单元对应的节点添加或移动到链表头。
4.如权利要求2所述的方法,其特征在于,当需要释放存储单元时,从所述最近最少使用链表的尾部取出节点值并重置对应的存储单元,以及从所述密集哈希表中删除对应的哈希值和下标值的对应关系。
5.如权利要求2所述的方法,其特征在于,根据所有空闲的存储单元对应的数组元素的下标值形成空闲链表;当分配存储单元时从该空闲链表中取出头节点,当最近最少使用链表中释放存储单元的下标值时,在该空闲链表的尾部添加该下标值。
6.如权利要求1至5任一项所述的方法,其特征在于,所述哈希表为密集型哈希表。
7.一种提高搜索信息速度的方法,其特征在于,包括如下步骤A、根据搜索请求,将用于搜索信息的关键词生成哈希值;B、利用所述哈希值查询用于索引缓存的搜索结果信息的哈希表,判断是否缓存有该关键词的搜索结果信息;若是,则进行步骤C、D,否则,进行步骤E、F;C、从所述哈希表中获得所述哈希值所对应的数值,并将该数值作为用于标识数组内存池中的存储单元的数组的下标值;D、从所述下标值确定的数组元素在所述数组内存池中所标识的存储单元内读取搜索结果信息,将该信息返回给请求方;E、由搜索引擎利用所述关键词进行搜索,获得的搜索结果信息;F、分配一个空闲的数组下标值,在型哈希表中建立所述哈希值与下标值间的映射关系,将所述搜索结果信息存储到该下标值确定的数组元素在所述数组内存池中标识的存储单元内,并将搜索结果信息返回给请求方。
8.如权利要求7所述的方法,其特征在于,根据所有已存储搜索结果信息的存储单元形成最近最少使用链表,链表中的每个节点关联一个已缓存搜索结果信息的存储单元,其中,链表头对应最近最常使用的存储单元的下标值,链表尾对应最近最少使用的存储单元的下标值。
9.如权利要求8所述的方法,其特征在于,分配存储单元存储搜索结果信息时,或所述最近最少使用链表中的节点所对应的存储单元内的搜索结果信息被使用时,将该存储单元对应的节点添加或移动到链表头。
10.如权利要求8所述的方法,其特征在于,当需要释放存储单元时,从所述最近最少使用链表的尾部取出节点并重置对应的存储单元,以及从所述哈希表中删除对应的哈希值和下标值的对应关系。
11.如权利要求8所述的方法,其特征在于,根据所有空闲的存储单元形成空闲链表,该链表中的每个节点对应数组内存池中的一个存储单元;当分配存储单元存储搜索结果信息时从该空闲链表中取出头节点,当最近最少使用链表中释放存储单元的下标值时,在该空闲链表的尾部添加该下标值。
12.如权利要求7所述的方法,其特征在于,从存储单元读取搜索结果信息时,还对该搜索结果信息进行有效性检查,并根据检查结果按下述情况分别处理若确定所述搜索结果信息的已保存时间在配置的信息有效时间内,则将搜索结果信息返回给请求方;若确定所述搜索结果信息的已保存时间大于配置的信息有效时间并且小于最大生命周期时间,则在读取该搜索结果信息后释放该存储单元,并利用所述关键词重搜索信息并缓存;若确定所述搜索结果信息的已保存时间不小于配置的最大生命周期时间,则释放存储单元,利用所述关键词重搜索信息,并将搜索结果提供给请求方并缓存。
13.如权利要求1至12任一项所述的方法,其特征在于,所述哈希表为密集型哈希表。
14.一种缓存系统,其特征在于,包括数组内存池,包含多个存储单元,用于缓存信息;哈希值生成模块,用于将与信息相关的关键词生成哈希值;哈希表,用于保存哈希值与数组中元素的下标识值之间的映射关系;管理模块,用于管理所述数组内存池中的已存储信息的存储单元和空闲的存储单元;保存信息模块,将信息存储到所述存储单元,并在所述哈希表中建立关键词的哈希值与该存储单元对应的数组元素下标值之间的映射关系。
15.如权利要求14所述的缓存系统,其特征在于,所述哈希表为密集型哈希表。
16.一种搜索系统,其特征在于,包括数组内存池,包含多个存储单元,用于缓存信息;哈希值生成模块,用于将搜索关键词生成哈希值;哈希表,用于保存哈希值与数组中元素的下标识值之间的映射关系,以及根据所述哈希值进行查询并提供查询结果;管理模块,用于管理所述数组内存池中的存储单元,将哈希值提供给所述哈希表和根据哈希表的查询结果判断是否缓存有所述关键词的搜索结果信息,以及将搜索结果信息返回给请求方;搜索引擎,用于在所述管理模块确定未缓存有搜索结果信息时,利用所述关键词搜索信息,并返回给管理模块;信息存取模块,用于在所述查询模块确定缓存有搜索结果信息时,从所述下标值确定的数组元素在数组内存池中所标识的存储单元内读取搜索结果信息;或者,将搜索引擎搜索的结果信息存储到所述存储单元,以及在所述哈希表中建立关键词的哈希值与该存储单元对应的数组元素下标值的映射关系。
17.如权利要求16所述的搜索系统,其特征在于,所述哈希表为密集型哈希表。
全文摘要
本发明公开了一种提高搜索信息速度的方法,该方法将用于搜索信息的关键词生成哈希值;利用所述哈希值查询哈希表判断是否已缓存有对应的搜索结果;若缓存有,从所述哈希表中获得所述对应、并用于标识数组内存池中的存储单元的数组元素下标值;从数组元素在所述数组内存池中所标识的存储单元内读取搜索结果信息返回给请求方;若未缓存,由搜索引擎利用所述关键词进行搜索并获得搜索结果,在型哈希表中建立所述哈希值与下标值间的映射关系,将所述搜索结果信息存储到该下标值确定的数组元素在所述数组内存池中标识的存储单元内并将搜索结果信息返回给请求方。本发明还同时公开了一种提高搜索信息速度的方法及系统。
文档编号G06F12/08GK1940922SQ20051010779
公开日2007年4月4日 申请日期2005年9月30日 优先权日2005年9月30日
发明者林海荣 申请人:腾讯科技(深圳)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1