包括资源有效索引的键值存储系统的制作方法

文档序号:16990236发布日期:2019-03-02 00:54阅读:145来源:国知局
包括资源有效索引的键值存储系统的制作方法

键值存储系统使用索引来访问内容存储库中的信息。例如,键值存储系统使用索引将给定键映射到对应的值在内容存储库中的位置。通常,索引使用存储器中散列表来执行这个映射操作。然而,提供以资源有效方式提供令人满意的性能的存储器中索引仍然是一项具有挑战性的任务。



技术实现要素:

本文中描述了一种用于使用资源有效索引来与内容存储库中的键值条目进行交互的键值存储系统。总的来说,索引使得键值存储系统能够从存储器使用、操作速度和处理器负载的角度提供良好的性能。

根据一个说明性方面,索引提供包括多个散列桶的数据结构。每个散列桶包括散列桶单元的链表。每个散列桶单元又包括组成员资格过滤器(例如,布隆过滤器)和散列块。散列块存储散列条目的集合。组成员资格过滤器提供用于测试对应的散列块是否可以包含所寻求的特定散列条目的机制。

根据另一说明性方面,散列块中的每个散列条目包括部分键。与内容存储库中提供的完整对应键相比,部分键的大小减小。

根据另一说明性方面,键值存储系统以分布式方式将与散列桶相关联的散列块存储在存储器中索引存储库与辅助索引存储库(诸如但不限于基于磁盘的辅助索引存储库)之间。

根据另一说明性方面,键值存储系统被配置为按照通常的时间顺序将散列条目存储在链接的散列桶单元的特定集合中,例如通过将每个新的散列条目存储在特定集合的头部散列桶单元中并且当先前头部散列桶单元不能容纳新的散列条目时创建新的头部散列桶单元。

根据另一说明性方面,键值存储系统不包括用于对键值进行排序的排序功能。因此,键值存储系统可以消除与排序功能相关联的处理负担。

根据另一说明性方面,索引还包括影响键值存储系统的性能的各种可调参数(本文中描述)。开发人员可以调节参数的值以平衡存储器消耗、系统速度和处理器负载,以实现期望的整体性能水平。

根据另一说明性方面,键值存储系统包括用于响应于垃圾收集过程来更新索引的机制。该机制提供了与垃圾收集过程的特定性质无关的服务。

根据另一说明性方面,键值存储系统提供了一种在内容存储库中保留(并且稍后访问)每个键值条目的多个版本的方式。

以上概括的功能可以表现在各种类型的系统、设备、组件、方法、计算机可读存储介质、数据结构、图形用户界面呈现、制品等中。

提供本“发明内容”是为了以简化的形式介绍一些概念;这些概念在下面的“具体实施方式”中进一步描述。本“发明内容”不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。

附图说明

图1示出了使用资源有效索引的键值存储系统的概述。

图2示出了由索引使用的数据结构的一部分。图2还示出了数据结构与存储在内容存储库中的键值条目的关系。

图3示出了键值存储系统可以在存储器中索引存储库与辅助索引存储库之间分布散列条目的一种方式。

图4示出了用于计算各种键相关值以用于图1的键值存储系统的功能。

图5示出了根据一个实现的用于实现图1的键值存储系统的计算机相关设备。

图6和7一起示出了用于将新的键值条目添加到图1的键值存储系统的过程。

图8示出了使用索引来保存键值条目的不同版本的相应位置的一种方式,不同版本与相同的键相关联。

图9-11一起示出了用于使用图1的键值存储系统来查询所寻求的键值条目的键的过程。

图12示出了用于更新图1的索引以考虑垃圾收集过程的过程。

图13示出了用于由于垃圾收集过程而在内容存储库内移动的键值条目的图12的过程的结果。

图14示出了用于由于垃圾收集过程而从内容存储库中逐出的键值条目的图12的过程的结果。

图15示出了可以用于实现前述附图中所示的特征的任何方面的说明性计算功能。

贯穿本公开内容和附图使用相同的数字来引用相同的组件和特征。系列100编号指的是最初在图1中找到的特征,系列200编号指的是最初在图2中找到的特征,系列300编号指的是最初在图3中找到的特征,依此类推。

具体实施方式

本公开内容如下组织。a部分描述了一种用于使用资源有效索引来与键值条目进行交互的计算机实现的系统。b部分阐述了说明a部分的系统的操作的说明性方法。c部分描述了可以用于实现a部分和b部分描述的特征的任何方面的说明性计算功能。

作为初步事项,一些附图在一个或多个结构组件的上下文中描述了概念,这些组件也称为功能、模块、特征、元件等。在一个实现中,图中所示的各种组件可以通过在计算机设备上运行的软件或硬件(例如,芯片实现的逻辑功能)等或其任何组合来实现。在一种情况下,图中的各个组件的所示出的分离为不同的单元可以反映对应的不同的物理和有形组件在实际实现中的使用。替代地或附加地,图中所示的任何单个组件可以由多个实际物理组件实现。替代地或附加地,附图中的任何两个或更多个单独的组件的描绘可以反映由单个实际物理组件执行的不同功能。c部分提供了关于图中所示功能的一个说明性物理实现的附加细节。

其他附图以流程图的形式描述了概念。在这种形式中,某些操作被描述为构成按照特定顺序执行的不同块。这些实现是说明性的而非限制性的。本文中描述的某些块可以分组在一起并且在单个操作中执行,某些块可以分成多个组件块,并且某些块可以按照与本文中所示的顺序不同的顺序执行(包括执行块的并行方式)。在一个实现中,流程图中示出的框可以由在计算机设备上运行的软件或硬件(例如,芯片实现的逻辑功能)等或其任何组合来实现。

关于术语,短语“被配置为”包含用于执行所标识的操作的各种物理和有形机构。这些机构可以被配置为使用例如在计算机设备上运行的软件、硬件(例如,芯片实现的逻辑功能)等或其任何组合来执行操作。

术语“逻辑”包含用于执行任务的各种物理和有形机构。例如,流程图中示出的每个操作对应于用于执行该操作的逻辑组件。操作可以使用例如在计算机设备上运行的软件、硬件(例如,芯片实现的逻辑功能)等或其任何组合来执行。当由计算设备实现时,逻辑组件以任何实现的方式表示作为计算系统的物理部分的电子组件。

本文中描述的任何存储资源或存储资源的任何组合可以被视为计算机可读介质。在很多情况下,计算机可读介质代表某种形式的物理和有形实体。术语计算机可读介质还包含传播信号,例如经由物理管道和/或空中或其他无线介质等传输或接收的信号。然而,特定术语“计算机可读存储介质”和“计算机可读存储介质设备”明确地排除传播信号本身,而包括所有其他形式的计算机可读介质。

以下说明可以将一个或多个特征标识为“可选的”。这种类型的陈述不应当被解释为可以被认为是可选的特征的详尽指示;也就是说,虽然未在文中明确指出,但其他特征可以被认为是可选的。此外,对单个实体的任何描述并不旨在排除使用多个这样的实体;类似地,对多个实体的描述并不旨在排除使用单个实体。此外,虽然描述可以将某些特征解释为执行所标识的功能或实现所标识的机制的替代方式,但是这些特征也可以以任何组合方式组合在一起。最后,术语“示例性”或“说明性”是指潜在的很多实现中的一种实现。

a.说明性系统

如上所述,键值存储系统使用存储器中索引将给定键映射到对应值在内容存储库中的位置。然而,这种技术可能消耗大量的存储器,特别是在存在大量键要与之竞争和/或键的大小很大的情况下。一些键值存储系统使用b树技术解决上述挑战。但是b树技术需要处理操作(诸如排序),这给键值存储系统带来了很大的处理负担。

图1示出了至少解决上述技术挑战的键值存储系统102。键值存储系统102包括存储库交互组件104、内容存储库106和索引108。存储库交互组件104使用索引108与内容存储库106交互。

内容存储库106存储多个键值条目。每个键值条目又至少指定全键和关联值。该值提供与键值条目相关联的内容。键对应于与值相关联的标识符。例如,考虑仅内容存储库106存储关于网站集合的信息的说明性情况。在该上下文中,每个键可以对应于与特定网站相关联的url。该值可以对应于与特定网站相关联的网站内容。考虑另一种情况,其中内容存储库106提供关于多个客户的信用历史信息。在该上下文中,每个键可以对应于与对应客户相关联的id。该值可以对应于该客户的信用记录。

内容存储库106可以使用一个或多个物理数据存储库110来实现。例如,内容存储库106可以使用硬盘存储机构、固态存储机构等或其任何组合来实现。

除了其他信息之外,索引108还存储多个散列条目。每个散列条目又可以至少指定部分键、地址值、大小信息等。部分键对应于对应全键的大小减小的版本。例如,部分键可以表示对应的全128位键的27位版本。以下描述(参考图4)将提供关于计算部分键的不同方式的进一步细节。在一种方法中,键值存储系统102通过以下方式(不限于此)来计算部分键:获取全键的一部分(例如,获取128位全键的一半),对该部分进行散列以生成散列结果,并且然后将该散列结果截断为期望的大小(例如,到27位)。地址值指定对应的键值条目存储在内容存储库106中的位置。大小信息指定存储在内容存储库106中的键值条目的大小。

索引108可以使用两个或更多个物理数据存储库112来实现。例如,键值存储库106可以使用存储器中索引存储库(也称为“存储器索引存储库”)以及辅助索引存储库来实现。辅助索引存储库可以对应于硬盘存储机构、固态存储机构等或其任何组合。与辅助索引存储库相比,存储器交互组件104更容易访问存储器中索引存储库中的信息。

在一个实现中,辅助索引存储库(与索引108相关联)由与内容存储库106相关联的相同物理数据存储库的至少一部分实现。在另一实现中,辅助索引存储库和内容存储库106由两个单独的物理数据存储库实现。

存储库交互组件104包括(或可以概念化为包括)执行不同的相应功能的多个子组件。插入组件114在内容存储库106中插入新的键值条目,并且在索引108中添加对应的新的散列条目。查询组件116使用索引108从内容存储库106中检索键值条目。也就是说,给定指定的全键,查询组件116使用索引108从内容存储库106中检索与给定的全键相关联的键值条目。重新定位和逐出(r&e)组件118响应于由垃圾收集功能120执行的垃圾收集过程而更新索引108。例如,r&e组件118负责键值条目从内容存储库106中的旧位置到新位置的移动。r&e组件118还负责键值条目从内容存储库106中的逐出。b部分阐述了描述插入组件114、查询组件116和r&e组件118的说明性操作的过程。

图1还示出了用于组织索引108内的信息的一个数据结构122。数据结构122包括多个散列桶124。在一个非限制性和说明性的情况下,数据结构122包括用于存储10gb数据的1024个散列桶。数据结构122还包括用于将指定全键的散列版本映射到散列桶124之一的桶索引126。指定全键的散列版本在本文中称为散列桶标识符。

每个散列桶包括多个链接的散列桶单元,诸如但不限于最多20个散列桶单元。在一个实现中,多个链接的散列桶单元可以形成为散列桶单元的链表。头部散列桶单元对应于链表中的第一散列桶单元。头部散列桶单元链接到链表中的第二散列桶单元。第二散列桶单元链接到链表中的第三散列桶单元,依此类推。桶索引126包括映射到相应头部散列桶单元的指针。

图2示出了散列桶单元的链表中的两个散列桶单元(202、204)的说明性组成。下面解释说明性散列桶单元202的组成。诸如散列桶单元204等其他散列桶单元具有与散列桶单元202相同的组成。

散列桶单元202包括布隆过滤器206。在任何给定时间,布隆过滤器206表示一组一个或多个布隆过滤器键,例如,通过存储从布隆过滤器键导出的一组布隆过滤器条目。每个布隆过滤器键(和对应的布隆过滤器条目)又是以下面将描述的方式(参考图4)从对应的全键中导出的。在操作中,查询组件116可以查询布隆过滤器206以确定指定的布隆过滤器键是否被包括在其一组布隆过滤器键内。如果该查询的回答是肯定的,则查询组件116可以推断出散列桶单元202可以包括所寻求的散列条目,受制于误报的概率。如果该查询的回答是否定的,则查询组件116可以最终确定散列桶单元202不包含所寻求的散列条目。

换言之,布隆过滤器206可以产生误报,但是不能产生漏报。当布隆过滤器206指示指定的布隆过滤器键是其组的成员但实际上布隆过滤器键不是该组的成员时发生误报。漏报(不能发生)对应于布隆过滤器206指示指定的布隆过滤器键不是其组的成员而实际上它实际上是成员的情况。个体布隆过滤器206以指定速率产生误报,该指定速率通常非常低。

散列桶单元202还包括到下一连续散列桶单元(在这种情况下,对应于散列桶单元204)的链接208。散列桶单元202还包括指向散列块212在辅助索引存储库中的位置的指针210。在操作中,查询组件116可以首先查询布隆过滤器206以确定给定布隆过滤器键是否被包括在一组布隆过滤器的编码布隆过滤器键内。该匹配结果还传达了所寻求的散列条目是否被包括在散列块212内。根据匹配结果,查询组件116然后确定散列桶单元202当前是否将散列块212存储在其存储器中(主)索引存储库中。如果不是,则查询组件116可以使用指针210从辅助索引存储库中检索散列块212并且将其存储在存储器中索引存储库中。

上述存储散列块的分布式方式是有助于减少键值存储系统102的存储器需求的一个因素。例如,索引108可以仅在(通过对应的布隆过滤器)确定散列块可以包含所寻求的散列条目时从辅助索引存储库中选择性地检索散列块。对于在散列桶中提供否定匹配结果的每个布隆过滤器,不需要将其对应的散列块存储在存储器中(主)索引存储库中。

散列块212本身包括多个散列条目,诸如,在一个非限制性实现中是512个散列条目。键值存储系统102采用多个散列条目以支持从辅助索引存储库存储和检索散列条目,而不是基于个体来存储和检索散列条目。每个散列条目至少包括部分键、地址值和大小信息。如上所述,部分键可以对应于全键的散列部分。在索引108中使用部分键(而不是对应的全键)进一步减少了索引108使用的存储器的量。地址值指定对应的键值条目存储在内容存储库106中的位置。例如,考虑特定的散列条目214。该散列条目214包括指向键值条目216在内容存储库106中的位置的地址值。大小信息描述了内容存储库106中的对应键值条目的大小。

尽管未在图2中明确示出,但是每个散列桶单元还可以存储布隆键块,该布隆键块提供用于在单元的布隆过滤器中生成布隆过滤器条目的原始布隆过滤器键。键值存储系统102依赖于在下面描述的垃圾收集处理期间存储在布隆键块中的布隆过滤器键。更具体地,响应于内容存储库106中的条目的移动和删除以及对索引108的对应改变,键值存储系统102依赖于布隆过滤器键来重建索引108中的布隆过滤器。不能依赖于散列块来重建布隆过滤器,因为它们不存储用于构建布隆过滤器的全键的部分。在其他实现中,布隆过滤器键可以存储在键值存储系统102内的其他位置和/或数据结构中。

图3示出了图1的键值存储系统102通过其在存储器中(主)索引存储库302与辅助索引存储库304之间分布散列块的一种方式。回想一下,辅助索引存储库304可以对应于硬盘存储机构、固态存储机构等或其组合。图3特别描绘了一个说明性散列桶306的组成。尽管仅在图3中以概要形式描绘,但是其他散列桶具有类似的组成。

说明性散列桶306包括散列桶单元的链表。也就是说,散列桶306包括第一(头部)散列桶单元308、第二散列桶单元310、第三散列桶单元312等。头部散列桶单元308包括存储器中头部布隆过滤器314和存储器中头部散列块316。同样,第二散列桶单元310包括存储器中布隆过滤器318和存储器中散列块320。但是,目前,第三散列桶单元312仅将布隆过滤器322存储在存储器中索引存储库302中;第三散列桶单元312将其对应的散列块324存储在辅助索引存储库304中(此时,不存储在存储器中索引存储库302中)。剩余的散列桶单元具有与第三散列桶单元312相同的配置。

更具体地,在一个实现中,插入组件114(图1)将每个新的散列条目添加到头部散列桶单元308,直到其对应的头部散列块316已满并且不能容纳附加散列条目的存储。在指示头部散列块316已满时,插入组件114创建新的散列桶单元并且将该新的散列桶单元添加到散列桶单元的链表的开头。换言之,该新的散列桶单元承担具有相关联的新的头部散列块的新的头部散列桶单元的角色。结果,可以说键值存储系统102基于它们被插入到索引108中的顺序按照通常的时间顺序跨越散列桶的散列块来存储新的散列条目。例如,与链表的头部附近的散列桶单元中的散列条目相比,链表的尾部附近的散列桶单元中的散列条目对应于较旧的条目。

如将在b部分中更详细地解释的,链表还可以存储表示与相同键相关联的键值条目的不同版本的散列条目。与表示键值条目的较旧版本的散列条目相比,表示键值条目的当前版本的散列条目将更接近链表的头部。

键值存储系统102管理每个散列桶,使得在任何给定时间,至少n个其最近创建的散列桶单元将其相应的散列块存储在存储器中索引存储库302中。剩余的散列桶单元将其相应的散列块存储在辅助索引存储库304中。在没有限制的情况下,在图3的示例中,n=2,因为散列桶单元308和散列桶单元310将其相应的散列块(316、320)存储在存储器中索引存储库302中。如上所述,该存储策略有助于减少键值存储系统102在任何给定时间所需要的存储器的量。

键值存储系统102将n个最近创建的散列块存储在存储器中索引存储库302中,因为存储库交互组件104将与这些散列块而不是较旧的散列块交互的概率增加。例如,键值存储系统102将头部散列块316存储在存储器中索引存储库302中,因为键值存储系统102将通过向其添加新的散列条目来重复与头部散列块316交互,直到它已满。

当查询组件116试图与其交互时,存储库交互组件104还可以在时间上将任何散列块从辅助索引存储库304移动到存储器中索引存储库302。例如,假定查询组件116试图找到与指定的全键相对应的键值条目。如将在b部分中更全面地描述的,查询组件116可以首先确定全键所对应的散列桶。假定它对应于图3的散列桶306。然后,查询组件116可以从头部散列桶单元308开始连续地测试每个相应散列桶单元的每个布隆过滤器,直到它找到匹配(如果有的话)。假定查询组件116确定第十九散列桶单元328的布隆过滤器326提供匹配,表明其对应的散列块330可以存储所寻求的散列条目,受制于小的误报概率。此时,存储库交互组件104可以从辅助索引存储库304中检索散列块330并且将其存储在存储器中索引存储库302中。然后,查询组件116继续处理散列块330中的散列条目以确定所寻求的散列条目是否被包括在散列块330内。

存储库交互组件104可以使用不同的策略来确定所查询的散列块将保留在存储器中索引存储库302中多长时间。在一种情况下,存储库交互组件104标记要在查询完成之后立即丢弃的存储器中散列块。在另一种情况下,存储库交互组件104标记用于在查询完成之后规定时间量移除的存储器中散列块。后一种策略可以适用于那些特定于应用的环境,在这些环境中,查询组件116将很快发出针对相同散列块的另一查询的概率提高。关于前面的头部散列块也是如此;当已经创建新的头部散列块时,或者在其之后的某个可配置时间,存储库交互组件104可以立即从存储器中索引存储库302中丢弃先前头部散列块。

图4示出了用于计算由图1的键值存储系统102使用的各种键相关值的功能。在一种情况下,存储库交互组件104可以将功能实现为公共资源组件库。插入组件114、查询组件116和r&e组件118可以依赖于这些资源组件来执行它们相应的操作。

作为第一操作,分解组件402可以将所考虑的全键404分成两个部分,对应于初始部分键406和布隆过滤器键408。例如,假定全键404包括x个信息单元(例如,x比特)。分解组件402可以使用这些信息单元的第一半部分来创建初始部分键406,并且使用这些信息单元的第二半部分来创建布隆过滤器键408。

第一计算组件410使用散列函数来散列整个键404以产生散列桶标识符。散列函数可以使用任何算法来实现,诸如循环冗余校验(crc)算法、任何种类的加密散列算法(例如,md5、sha-1)等。

第二计算组件412可以可选地使用任何散列函数来散列初始部分键406以产生散列结果。另外,第二计算组件412可以截断散列结果以对应于特定大小,以产生最终的部分键。与全键404(例如,具有128位的大小)相比,最终的部分键具有减小的大小(例如,具有27位的大小)。其他实现可以以替代方式产生最终的部分键。例如,另一种实现可以使用初始部分键作为最终的部分键,而无需修改。因此,如本文中使用的,术语“部分键”表示以任何方式从全键404导出的任何信息项,其与全键404相比具有更小的大小。

第三计算组件414使用一组k个独立散列函数来对布隆过滤器键408进行散列以产生布隆过滤器条目。k个散列函数中的每个将布隆过滤器键408映射到布隆过滤器206内的一种m个单元位置内的特定单元位置。

更具体地,第三计算组件414可以与插入组件114和查询组件116协同工作。在第一种情况下,假定插入组件114调用第三计算组件414以向布隆过滤器206添加新的布隆过滤器条目。这里,第三计算组件414将k个散列函数应用于布隆过滤器键408以确定布隆过滤器206中的一组k个单元位置,并且然后将这些单元的值设置为1(假定,在默认情况下,每个单元值最初设置为0,直到其被修改)。

在第二种情况下,假定查询组件116调用第三计算组件414以确定布隆过滤器206是否已经表示特定布隆过滤器键408。这里,第三计算组件414将k个散列函数应用于布隆过滤器键408以确定布隆过滤器206中的一组k个单元。然后,第三计算组件414确定这些k个单元中的每个是否具有值1。如果k个单元中的至少一个单元具有零值,则查询组件116最终确定布隆过滤器206与布隆过滤器键408不匹配(表示不存在漏报的概率)。如果所有k个单元具有值1,则查询组件116确定布隆过滤器206与布隆过滤器键408相匹配,受制于误报已经发生的规定概率(其通常非常低)。

注意,除了布隆过滤器之外,数据结构122还可以使用其他类型的组成员资格过滤器。通常,组成员资格过滤器以任何方式表示一组组成员资格键。它还提供了一种确定指定组成员资格键是否被包括在组中的方法。替代组成员资格技术(除了布隆过滤器技术)包括但不限于基于字典的技术、散列压缩技术、布谷鸟过滤技术(其涉及使用布谷鸟散列)等。

更一般地,注意,图4的功能基于相同的全键404计算最终的部分键和布隆过滤器条目。但是第二计算组件412和第三计算组件414以独立的方式执行其相应的操作(例如,其相应的散列操作)。

图5示出了根据一个实现的用于实现图1的键值存储系统102的计算机设备。在这种情况下,远程计算功能502提供网络可访问的存储相关服务(例如,云存储服务)。存储相关服务可以包括图1中所示的所有特征,包括存储库交互组件104和用于实现内容存储库106和索引108的数据存储库(110、112)。从物理角度来看,远程计算功能502可以使用一个或多个服务器计算设备和任何其他计算机相关设备(例如,路由器等)来实现。

任何客户端计算功能504可以经由通信管道506与远程计算功能502交互。在一个场景中,客户端计算功能504可以对应于任何类型的用户计算设备。用户可以使用客户端计算功能504与远程计算功能502交互以存储信息,检索信息,等等。在另一场景中,客户端计算功能504可以对应于与任何类型的系统相关联的某个(某些)服务器计算设备。例如,客户端计算功能504可以对应于另一网络可访问服务,该服务执行作为其一部分涉及与由远程计算功能502提供的存储服务的交互的过程。通信管道506可以对应于广域网络(例如,因特网)、局域网、任何类型的对等网络、一个或多个点对点链接等。

在另一实现中,键值存储系统102的至少一些特征可以以任何方式在远程计算功能502和客户端计算功能504之间分布。在另一实现中,客户端计算功能504实现与键值存储系统102相关联的所有功能的单独实例,从而完全消除远程计算功能502的使用。

b.说明性过程

图6-7和9-12以流程图的形式示出了解释a部分的键值存储系统102的操作的过程。由于已经在a部分中描述了键值存储系统102的操作的基本原理,因此本部分中将以概要的方式解决某些操作。如在“具体实施方式”的前言部分中所指出的,流程图被表示为按照特定顺序执行的一系列操作。但是这些操作的顺序仅仅是代表性的,并且可以以任何方式变化。

图6和7一起示出了用于将新的键值条目添加到图1的键值存储系统102的过程602。在框604中,插入组件114接收全键和与新的键值条目相关联的值。在框606中,插入组件114将全键和值存储在内容存储库106中以提供新的键值条目。在框608中,插入组件114散列全键以生成散列桶标识符。在框610中,插入组件114基于全键生成部分键。在框612中,插入组件114基于全键生成组成员资格过滤器条目(例如,布隆过滤器条目)。参考图4,a部分解释了用于执行框608-612的说明性技术。在框614中,插入组件114基于在框608中计算的散列桶标识符来标识匹配的散列桶(如果有的话)。

前进到图7,在框702中,插入组件114确定匹配的散列桶中的头部散列桶单元内包括的现有头部散列块是否已满。如果现有头部散列块已满,则在框704中,插入组件114创建新的头部散列桶单元,其具有新的组成员资格过滤器和新的散列块。在框706中,插入组件114将组成员资格过滤器条目(在框612中计算的)添加到新的头部散列桶单元的组成员资格过滤器(如果它已经被创建),否则插入组件114将其添加到现有头部散列桶单元。在框708中,插入组件114将新的散列条目存储到新的头部散列块(如果它已经被创建),否则插入组件114将其存储在现有头部散列块中。新的散列条目至少包括部分键(在框610中计算的)和新的键值条目存储在内容存储库106中的地址值。

图8示出了图6的过程602如何操作以在散列桶中添加与在内容存储库106中提供的键值条目的不同的相应版本相对应的不同的散列条目。与键值条目的不同版本相对应的每个散列条目与相同的键(例如,键x)相关联。

更具体地,假定插入组件114将与键值条目的第一版本相对应的第一散列条目802存储在散列桶单元804中。第一散列条目802包括指向键值条目的第一版本在内容存储库106中的位置的地址值。在插入第一散列条目802时,假定散列桶单元804表示链表的头部散列桶单元。但是目前,假定散列桶单元804不再是头部散列桶单元,因为在插入第一散列条目802之后,后续散列桶单元已经被添加到链表的开头。

在更近的操作中,假定插入组件114将第二散列条目806(与键值条目的第二版本相对应)存储在散列桶单元808中。散列桶单元808表示当前时间的头部散列桶单元。第二散列条目806包括指向键值条目的第二版本在内容存储库106中的位置的地址值。在这种情况下,插入组件114将第二散列条目806添加到散列桶单元808。因为该散列桶单元是链表的头部(并且因为所有新的散列条目存储在头部散列桶单元中,甚至与先前存储的键值条目的修订相对应的那些散列条目)。

总的来说,观察到,散列桶单元的任何链表揭示了基于对应散列条目在链表中的位置来对键值条目进行修订的大致定时。如下所述,存储库交互组件104还可以通过从内容存储库106中选择性地检索键值条目的期望版本来利用上述存储不同版本的方式。

插入组件114还可以使用图6和7的过程602来从内容存储库106中删除条目,并且对索引108进行对应的更新。为此,插入组件114将新的键值条目添加到具有正确键的内容存储库106中作为要删除的条目,但是具有空值(对应于通过定义与空结果相关联的任何值)。插入组件114以与上述相同的方式更新索引108以反映已经添加到内容存储库106的键值条目的新版本。

图9-11一起示出了用于使用图1的键值存储系统102查询所寻求的键值条目的键的过程902。在框904中,查询组件116接收与所寻求的键值条目相关联的全键。在框906中,查询组件116散列全键以生成散列桶标识符。在框908中,查询组件116基于全键生成部分键。在框910中,查询组件116基于全键生成组成员资格过滤器条目(例如,布隆过滤器条目)。同样,a部分(参考图4)描述了用于执行操作906-910的一种技术。

前进到图10,在框1002中,查询组件116基于散列桶标识符标识匹配的散列桶。在框1004中,查询组件116通过将组成员资格过滤器条目(在框910中计算的)与匹配的散列桶中的每个组成员资格过滤器进行比较直到找到匹配(如果有的话)来标识匹配的散列桶单元。匹配的散列桶包括相关联的匹配的散列块。

在框1006中,查询组件116确定存储器中索引存储库302中是否提供有匹配的散列块。在框1008中,如果匹配的散列块尚未存在于存储器中索引存储库302中,则查询组件116从辅助索引存储库304中检索匹配的散列块,并且将匹配的散列块存储在存储器中索引存储库302中。在框1010中,查询组件116通过比较所寻求的键值条目的部分键(在框908中计算的)与匹配的散列块中的每个散列条目来标识匹配的散列块中的匹配的散列条目(如果有的话)。

匹配的散列块有可能不包括匹配的散列条目,例如,因为对应的组成员资格过滤器受制于误报。如果框1010终止于未能找到匹配的散列条目,则处理流程返回到框1004,在框1004中,查询组件116继续检查下一散列桶单元。如果到达最后的散列桶单元而没有遇到匹配的散列条目,则过程902终止于指示无法找到所寻求的键值条目。但是在该示例中,假定框1010成功地标识匹配的散列条目。

前进到图11,在框1102中,查询组件116从内容存储库106中检索与由匹配的散列条目(在框1010中标识的)指定的地址值相匹配的键值条目以提供检索的键值条目。在框1104中,查询组件116确定与检索的键值条目相关联的全键是否与如框904中提供的与所寻求的键值条目相关联的全键相匹配。在框1106中,如果检索的键值条目的全键与和所寻求的键值条目相关联的全键不匹配,则查询组件116在索引内继续搜索。也就是说,查询组件116通过返回到框1010来继续搜索。

查询组件116可以以不同方式实现继续搜索操作。假定查询组件116确定匹配的散列条目导致冲突,这表示它指向内容存储库106中除了所寻求的键值条目之外的某个键值条目。查询组件116可以将匹配的散列条目标记为无效,例如,通过将其地址值存储在无效的条目存储库中,以指示该地址值指向不正确的散列值条目。然后,查询组件116可以重新执行搜索操作。在重试时,查询组件116将首先遇到相同的先前标识的散列条目。然后,查询组件116可以查询无效条目存储库以确定先前标识的匹配散列条目不对应于正确的所寻求的键值条目。此时,查询组件116在匹配的散列桶内继续搜索,超过先前标识的匹配散列条目。也就是说,查询组件116将首先通过查看匹配的散列桶单元中超过先前标识的匹配散列条目的散列条目来继续搜索。如果未找到另一匹配的散列条目,则查询组件116将前进以检查与下一匹配的散列块(如果有的话)相关联的散列条目,等等。

在一些实现中,垃圾收集过程(由图1的垃圾收集功能120执行)可以通过删除散列条目并且将散列条目移动到新位置来在内容存储库106上操作。如下面将参考图12描述的,r&e组件118可以对索引108进行补充更新。这些垃圾收集操作存在索引108将不再包含先前已经被标记为无效的地址值的风险。查询组件116可以通过再重新执行对所寻求的键值条目的搜索来解决这种情况,即,没有任何先前标识的匹配的散列条目的任何先前知识。查询组件116可以在每当它获知r&e组件118已经修改索引108时采用这种方法,使得先前标识的无效地址值可以不再出现在索引108中,或者如果它们确实出现,则可以不再指向无效的键值条目。

查询组件116还可以被配置为检索键值条目的一个或多个特定版本。例如,假定存在键值条目在不同的相应时间创建的三个版本存储在内容存储库106中,并且对于这三个版本在索引108中存在三个对应的散列条目。进一步假定调用者希望检索最旧的版本,例如,对应于第一版本。查询组件116可以通过以上述方式从最新到最旧检查散列块来检索期望的版本。在这样做时,查询组件116将首先遇到与第三(和最新)版本相关联的匹配的散列条目。查询组件116在验证该版本确实对应于正确的第三版本之后将忽略该版本,例如,通过检查内容存储库106中的对应的全键。在继续搜索时,查询组件116接下来将遇到与第二版本相关联的匹配的散列条目。同样,在验证该匹配的散列条目确实对应于正确的第二版本之后,查询组件116将忽略该匹配的散列条目。在继续搜索时,查询组件116将最终遇到与期望的第一版本相关联的匹配的散列条目。然后,在验证该条目对应于所寻求的键值条目之后,查询组件116将检索由最终的匹配的散列条目的地址值指定的键值条目。

在另一种情况下,调用者可以请求检索键值条目的任何两个或更多个(包括所有)版本。查询组件116将执行与上面相同的操作,但是在这种情况下,查询组件116将检索多个键值条目。

图12示出了用于更新图1的索引以考虑垃圾收集过程的过程1202。垃圾收集功能120(图1)可以在周期性和/或事件驱动的基础上执行垃圾收集过程以重新定位内容存储库106中的至少一些键值条目和/或逐出内容存储库106中的至少一些键值条目。垃圾收集功能120执行该任务以去除已经删除和覆盖的键值条目。通过这样做,垃圾收集功能120创建用于容纳新的键值条目的存储空间。r&e组件118通过对索引108进行适当的改变以考虑对内容存储库106所做的改变来补充该垃圾收集过程。

在框1204中,r&e组件118关于至少一个经修改的键值条目从垃圾收集功能120接收修改信息。经修改的键值条目对应于内容存储库106中已经被垃圾收集功能120修改的特定键值条目。修改信息可以包括与特定键值条目相关联的旧的地址值、与特定键值条目相关联的新的地址值和与特定键值条目相关联的键。在框1206中,r&e组件118使用修改信息来在索引108中寻找匹配的散列条目。在框1208中,r&e组件118基于修改信息更新匹配的散列条目。

r&e组件118通过使用指定的键以与上面关于过程902描述的相同的方式寻找匹配的散列条目来执行框1206。然而,在这种情况下,r&e组件118可以通过确定与匹配的散列条目相关联的地址值是否与由修改信息给出的旧的地址值相匹配来验证匹配的散列条目是正确的(并且不是冲突的结果)。该确定是结论性的,使得r&e组件118不需要从内容存储库106中检索任何信息。如果旧的地址值与和匹配的散列条目相关联的地址值之间存在不匹配,则r&e组件118可以继续搜索下一匹配的散列条目。

图13示出了用于已经在内容存储库106内移动的特定键值条目的图12的过程的结果。更具体地,假定垃圾收集过程将内容存储库106中的特定键值条目从内容存储库106中与旧的地址值相关联的旧位置移动到内容存储库106中与新的地址值相关联的新位置。r&e组件118通过将由匹配的散列条目1302(与旧位置相关联)指定的地址值1304改变为与新位置相关联的新的地址值来更新匹配的散列条目1302。换言之,r&e组件118在其散列块内就地更新匹配的散列条目1302。

图14示出了用于由于垃圾收集过程而从内容存储库中逐出的特定键值条目的图12的过程的结果。在这种情况下,r&e组件118将新的地址值设置为无效值以指示新的地址值无效。“无效值”是指随后默认被解释为无效的任何值。此外,r&e组件118通过改变由匹配的散列条目1402指定的地址值1404以与无效值相对应来更新匹配的散列条目1402。另外,r&e组件118可以更新匹配的散列条目1402的部分键1406以与无效值相对应。通过这样做,r&e标记匹配的散列条目1402以便随后由r&e组件118移除。

r&e组件118(或一些其他过程)可以执行后续压缩或清理过程以清除无效散列条目的索引108。r&e组件118可以在周期性或事件驱动的基础上执行该任务。在一种方法中,r&e组件118可以为每个散列桶创建散列桶单元的新的链表。然后,r&e组件118可以将所有有效散列条目从链表的第一版本复制到链表的新版本,以省略任何无效的散列条目。r&e组件118还更新桶索引126,使得它包括指向新的链表的各个头部的指针。

注意,r&e组件118对由垃圾收集功能120所采取的动作做出反应,但是对于由垃圾收集功能120执行的垃圾收集过程的性质而言是不可知的(并且独立于该性质)。换言之,r&e组件118可以与任何垃圾收集过程一起工作,只要它通过垃圾收集过程被通知它对内容存储库106中的键值条目所做的改变。

作为该部分中的最后的主题,图2的键值存储系统102包括可以被调节以确保期望性能的各种参数。性能从至少存储器消耗、操作速度和处理负载的角度来衡量。参数可以包括但不限于:散列桶的数目;与每个散列桶相关联的散列桶单元的最大数目;每个散列块的散列条目的最大数目;在任何给定时间存储在存储器中索引存储库302中的散列块的数目;每个部分键值的大小;与每个单独的组成员资格过滤器相关联的误报概率;与散列桶的组成员资格过滤器的整个集合相关联的误报概率;与将部分键与特定散列块内的散列条目相匹配的过程相关联的块冲突概率等。

关于误报概率的主题,过滤器特定的误报概率表示每个单独的组成员资格过滤器将提供误报结果的机会。对于布隆过滤器,过滤器特定的误报概率近似对应于(1-e-kn/m)k,其中m是布隆过滤器206中的单元位置的数目,n是由布隆过滤器206表示的布隆键的数目,并且k是用于产生每个布隆过滤器条目的散列函数的数目。总体误报概率对应于散列桶内的至少一个布隆过滤器将提供误报结果的二项式概率。根据一种配置,键值存储系统102可以通过每个散列桶最多使用20个散列桶单元以及1kb布隆过滤器来确保不超过1%的查询将产生误报结果,1kb布隆过滤器表示最多512个布隆过滤器条目并且过滤器特定的误报概率小于0.05%。

块冲突概率是指给定的部分键将关于散列块中的任何散列条目产生至少一个错误匹配的机会。冲突概率可以基于以下公式来计算:

α对应于部分键的大小。β对应于散列块中的散列条目的数目。例如,对于α=27位并且β=512个散列条目,块冲突概率对应于小于0.05%的错误匹配率。

不同的参数以不同的方式影响性能。例如,在任何给定时间,部分键的大小和存储器中的散列块的数目都会影响键值存储系统102的存储器消耗。整体误报概率和块冲突概率影响键值存储系统102的操作速度和由键值存储系统102施加的处理器负载;这是因为,错误匹配的任何实例会降低键值存储速度并且消耗处理周期。

此外,注意,降低存储器利用率(这是期望的)的改变可能对处理速度和处理器负载产生不期望的改变,反之亦然。例如,开发人员可以减小每个部分键的大小,但是这样做会增加键值存储系统102的冲突率,这进而减慢了键值存储系统102的操作。开发人员可以选择参数值的特定组合以实现期望的资源消耗以适应特定环境的需求。

进一步注意,上述键值存储系统102不涉及键的排序,键的排序是很多传统键值存储系统的常见组件。因此,键值存储系统102可以消除否则将进入排序操作的处理循环。这产生处理速度的增加和处理负荷的减少。但是注意,还可以将键值存储系统102与键排序功能组合。换言之,键值存储系统不排除排序操作,尽管它在没有排序操作的情况下可以以更快的速度操作。

c.代表性计算功能

图15示出了可以用于实现上述附图中阐述的机制的任何方面的计算功能1502。例如,图15中所示的计算功能1502的类型可以用于实现图5的远程计算功能502(诸如服务器计算设备)、客户端计算功能504(诸如用户计算设备)等中的任何一个。然而,注意,图15中描述的一组特征是说明性的,并且计算功能1502的任何特定表现可以省略图15中所示的一个或多个特征,和/或添加图15中未示出一个或多个特征。在所有情况下,计算功能1502表示一个或多个物理和有形处理机构。

计算功能1502可以包括一个或多个硬件处理器设备1504,诸如一个或多个中央处理单元(cpu)、和/或一个或多个图形处理单元(gpu)等。计算功能1502还可以包括用于存储任何类型的信息(诸如机器可读指令、设置、数据等)的任何存储资源(也称为计算机可读存储介质或计算机可读存储介质设备)1506。例如,存储资源1506可以包括但不限于任何类型的ram、任何类型的rom、闪存设备、硬盘、光盘等中的任何一个。更一般地,任何存储资源可以使用任何技术来存储信息。此外,任何存储资源可以提供信息的易失性或非易失性保留。此外,任何存储资源可以表示计算功能1502的固定或可移除组件。当(多个)硬件处理器设备1504执行存储在任何存储资源或存储资源的组合中的计算机可读指令时,计算功能1502可以执行上述任何功能。例如,(多个)硬件处理器设备1504可以执行计算机可读指令以执行部分b中描述的每个过程。计算功能1502还可选地包括用于与任何存储资源交互的一个或多个驱动机构1508,诸如硬盘驱动机构、光盘驱动机构等。

在一些用户计算设备表现形式中,计算功能1502还包括用于接收各种输入(经由输入设备1512)以及用于提供各种输出(经由输出设备1514)的输入/输出组件1510。一个特定的输出机构可以包括显示设备1516和相关联的图形用户界面呈现(gui)1518。在一些表现形式中,计算功能1502还可以包括用于经由一个或多个通信管道1522与其他设备交换数据的一个或多个网络接口1520。一个或多个通信总线1524将上述组件通信地耦合在一起。

(多个)通信管道1522可以以任何方式实现,例如,通过局域计算机网络、广域计算机网络(例如,因特网)、点对点连接等或其任何组合。(多个)通信管道1522可以包括由任何协议或协议的组合管理的硬连线链接、无线链接、路由器、网关功能、名称服务器等的任何组合。

替代地或附加地,前面部分中描述的任何功能可以至少部分由一个或多个硬件逻辑组件来执行。例如而非限制,计算功能1502(及其硬件处理器)可以使用以下中的一个或多个来实现:现场可编程门阵列(fpga);专用集成电路(asic);专用标准产品(assp);片上系统(soc);复杂可编程逻辑器件(cpld)等。在这种情况下,机器可执行指令包含在硬件逻辑本身中。

以下概述提供本文中描述的技术的说明性方面的非详尽列表。

根据第一方面,本文中描述了一种由一个或多个计算设备实现的键值存储系统。键值存储系统包括用于存储多个键值条目的内容存储库,每个键值条目提供全键和关联值。键值存储系统还包括包括存储器中索引存储库和辅助索引存储库的索引、以及被配置为使用索引与内容存储库交互的存储库交互组件。索引提供包括多个散列桶的索引数据结构。每个散列桶包括链接的散列桶单元的集合,并且每个散列桶单元包括组成员资格过滤器和散列块。每个组成员资格过滤器提供用于确定所考虑的组成员资格键是否与对应的散列桶单元相关联的机制。每个散列块包括多个散列条目。每个散列条目至少提供部分键和地址值。每个部分键和每个组成员资格键是从所考虑的全键导出的,并且每个地址值指定对应键值条目在内容存储库中的位置。存储库交互组件被配置为通过将每个新的散列条目存储在链接的散列桶单元的特定集合的头部散列桶单元中,并且当先前头部散列桶单元不能容纳新的散列条目时创建新的头部散列桶单元,来基于创建时间按照时间顺序将散列条目存储在特定集合中。链接的散列桶单元的每个集合将其最近创建的散列块中的至少一个存储在存储器中索引存储库中,并且将其至少一些其他散列块存储在辅助索引存储库中。

根据第二方面,键值存储系统至少部分由与网络可访问存储服务相关联的一个或多个服务器计算设备实现。

根据第三方面,键值存储系统至少部分由用户计算设备实现。

根据第四方面,键值存储系统省略了用于对索引中的键进行排序的排序功能。

根据第五方面,每个部分键和每个组成员资格键基于所考虑的全键的不同的相应部分。

根据第六方面,每个组成员资格过滤器对应于布隆过滤器。

根据第七方面,每个散列桶单元包括指针,该指针指向其对应的散列块存储在辅助索引存储库中的位置。

根据第八方面,存储库交互组件包括被配置为将新的键值条目存储在键值存储系统中的插入组件。插入组件包括:被配置为接收全键和与新的键值条目相关联的值的逻辑;被配置为将全键和值存储在内容存储库中以提供新的键值条目的逻辑;被配置为散列全键以生成散列桶标识符的逻辑;被配置为基于全键生成部分键的逻辑;被配置为基于全键生成组成员资格过滤器条目的逻辑;被配置为基于散列桶标识符标识匹配的散列桶的逻辑;被配置为确定匹配的散列桶中的现有头部散列桶单元中包含的现有头部散列块是否已满的逻辑;被配置为在现有头部散列块已满的情况下创建具有新的头部散列块的新的头部散列桶单元的逻辑;被配置为在已经创建新的头部散列桶单元的情况下将组成员资格过滤器条目添加到新的头部散列桶单元的组成员资格过滤器,否则将组成员资格过滤器条目添加到现有头部散列桶单元的逻辑;以及被配置为在已经创建新的头部散列块的情况下将新的散列条目存储在新的头部散列块中,否则将新的散列条目存储在现有头部散列块的逻辑,新的散列条目至少包括部分键和新的键值条目存储在内容存储库中的地址值。

根据第九方面,存储库交互组件被配置为通过以下方式更新键值条目:将键值条目的新版本存储在内容存储库中;以及将与键值条目的新版本相对应的新的散列条目存储在索引中,同时保留与键值条目的先前版本相对应的旧的散列条目。索引使得能够检索新版本或旧版本。

根据第十方面,存储库交互组件包括被配置为在键值存储系统中定位所寻求的键值条目的查询组件。查询组件包括:被配置为接收与所寻求的键值条目相关联的全键的逻辑;被配置为散列全键以生成散列桶标识符的逻辑;被配置为基于全键生成部分键的逻辑;被配置为基于全键生成组成员资格过滤器条目的逻辑;被配置为基于散列桶标识符标识匹配的散列桶的逻辑;被配置为通过将组成员资格过滤器条目与匹配的散列桶的每个组成员资格过滤器进行比较直到找到匹配(如果有的话)来标识匹配的散列桶单元的逻辑,其中匹配的散列桶单元包括相关联的匹配的散列块;被配置为确定存储器中索引存储库中是否提供有匹配的散列块的逻辑;以及被配置为在匹配的散列块不在存储器中索引存储库中的情况下从辅助索引存储库中检索匹配的散列块并且将匹配的散列块存储在存储器中索引存储库中的逻辑。

根据第十一方面,查询组件还包括:被配置为通过将所寻求的键值条目的部分键与匹配的散列块中的每个散列条目进行比较来标识匹配的散列块中的匹配的散列条目(如果有的话)的逻辑;以及被配置为从内容存储库中检索与由匹配的散列条目指定的地址值相匹配的键值条目以提供检索的键值条目的逻辑。

根据第十二方面,查询组件还包括:被配置为确定与检索的键值条目相关联的全键是否与和所寻求的键值条目相关联的全键相匹配的逻辑;以及被配置为在检索的键值条目的全键与和所寻求的键值条目相关联的全键不匹配的情况下在索引内继续搜索的逻辑。

根据第十三方面,存储库交互组件包括被配置为响应于垃圾收集功能的操作而更新索引的重新定位和逐出(r&e)组件。r&e组件包括被配置为接收针对经修改的键值条目的修改信息的逻辑,经修改的键值条目与内容存储库中已经由垃圾收集功能修改的特定键值条目相对应,其中修改信息包括与特定键值条目相关联的旧的地址值、与特定键值条目相关联的新的地址值和与特定键值条目相关联的键;被配置为基于修改信息在索引中查找匹配的散列条目的逻辑;以及被配置为基于修改信息更新匹配的散列条目的逻辑。

根据第十四方面,在第一种情况下,特定键值条目已经被垃圾收集功能修改以将特定键值条目从内容存储库中与旧的地址值相关联的旧位置移动到内容存储库中与新的地址值相关联的新位置。在这种情况下,被配置为更新的上述逻辑被配置为通过改变由匹配的散列条目指定的地址值以与新的地址值相对应来更新匹配的散列条目。

根据第十五方面,在第二种情况下,特定键值条目已经被垃圾收集功能修改以从内容存储库中逐出特定键值条目。在这种情况下,新的地址值被设置为无效值以指示新的地址值无效,并且被配置为更新的上述逻辑被配置为通过改变由匹配的散列条目指定的地址值以与无效值相对应来更新匹配的散列条目。

根据第十六方面,在第二种情况下,被配置为更新的上述逻辑还被配置为更新匹配的散列条目的部分键以与无效值相对应。

根据第十七方面,散列桶的组成员资格过滤器的每个分组具有可配置的总体误报概率,可配置的总体误报概率对应于给定组成员资格键与组成员资格过滤器的分组中的任何一个组成员资格过滤器相匹配,但是对应的散列桶单元不包含所寻求的散列条目的概率。此外,每个特定散列块具有可配置的块冲突概率,可配置的块冲突概率对应于给定的部分键与特定散列块中的特定散列条目相匹配,但是特定散列条目不标识内容存储库中的所寻求的散列条目的概率。此外,键值存储系统表现出至少取决于可配置的整体误报概率和可配置的块冲突概率的性能水平。

根据第十八方面,描述了一种用于将新的键值条目存储在键值存储系统中的方法。该方法包括:将新的键值条目存储在内容存储库中,新的键值条目提供全键和关联值;标识与全键相关联的匹配的散列桶,匹配的散列桶包括散列桶单元的链表,每个散列桶单元包括组成员资格过滤器和用于存储散列条目的散列块;以及在与链表的头部散列桶单元相关联的头部散列块处存储新的散列条目。散列桶单元的每个链表将其最近创建的散列块中的至少一个散列块存储在存储器中索引存储库中,并且将至少一些其他散列块存储在辅助索引存储库中。

根据第十九方面,上述方法中的每个散列条目指定与内容存储库中提供的对应的键值条目的全键相关联的部分键。

根据第二十方面,描述了一种用于存储计算机可读指令的计算机可读存储介质,计算机可读指令在由一个或多个处理器设备执行时执行用于从内容存储库中检索信息的方法。该方法包括:接收与内容存储库中的所寻求的键值条目相关联的全键;基于全键生成部分键和组成员资格过滤器条目;标识与全键相关联的匹配的散列桶,匹配的散列桶包括散列桶单元的链表,每个散列桶单元包括组成员资格过滤器和用于存储散列条目的散列块;基于组成员资格过滤器条目标识匹配的散列桶中的匹配的散列桶单元,匹配的散列桶单元包括匹配的散列块;从辅助索引存储库中检索匹配的散列块,并且如果匹配的散列块不在存储器中索引存储库中,则将匹配的散列块存储在存储器中索引存储库中;基于部分键在匹配的散列块中标识匹配的散列条目(如果有的话);基于由匹配的散列条目指定的地址值从内容存储库中检索键值条目以提供检索的键值条目;以及确定与检索的键值条目相关联的全键是否与和所寻求的键值条目相关联的全键相匹配。

第二十一方面对应于上述第一至第二十一方面的任何组合(例如,任何置换或子集)。

第二十二方面对应于与第一至第二十一方面相关联的任何方法对应物、设备对应物、系统对应物、装置加功能对应物、计算机可读存储介质对应物、数据结构对应物、制品对应物、图形用户界面呈现对应物等。

最后,尽管用结构特征和/或方法动作特定的语言描述了本主题,但是应当理解,所附权利要求书中限定的主题不必限于以上描述的具体特征或动作。而是,上述具体特征和动作被公开作为实现权利要求的示例形式。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1