掌桥专利:专业的专利平台
掌桥专利
首页

一种数据存储方法、装置、电子设备及存储介质

文献发布时间:2024-04-18 19:58:30


一种数据存储方法、装置、电子设备及存储介质

技术领域

本申请涉及数据处理技术领域,尤其涉及一种数据存储方法、装置、电子设备及存储介质。

背景技术

随着企业业务的快速发展,为了应对大量复杂的业务和庞大的业务数据,越来越多的系统开始采用分布式架构。分布式架构是按照业务边界,将大型单体应用拆分成小型的,且可独立部署的服务单元,通过服务注册中心协同完成复杂的业务逻辑。在银行系统中,普遍采用分布式协调服务zookeeper作为服务注册中心。

现有技术中,对服务注册中心的数据进行存储时,通常采用数据库,对服务注册中心的数据持久化存储,同时利用数据库自身的索引和缓存等功能,满足数据的查询等需求。

然而,由于数据库不参与业务处理,数据的同步完全由服务注册中心来完成,因此数据库的利用率较低,数据库系统长期处于闲置状态。并且数据库系统可能由于第三方的原因导致整个数据库系统不可用而使服务注册中心的服务同样陷入风险,安全性不高,同时,数据库系统仍需要配备相应的运维人员,设备资源进行维护,造成资源浪费。

因此,需要针对上述问题提出一种新的数据存储方法。

发明内容

本申请实施例提供一种数据存储方法、装置、电子设备及存储介质,以提高数据存储的安全性。

本申请实施例提供的具体技术方案如下:

第一方面,提供一种数据存储方法,包括:

接收针对服务注册中心的数据存储请求,获取服务注册中心对应的待存储信息集;

将待存储信息集中包含的各待存储服务信息,按照各待存储服务信息各自的待存储服务码,构建当前前缀树,存储各待存储服务信息,并将各待存储服务信息各自的待存储服务码和所属的服务组件单元,存储至倒排索引中,其中,各待存储服务信息是各业务操作的配置信息;

采用哈希表,对待存储信息集中包含的各待存储非服务信息进行存储。

第二方面,提供一种数据存储装置,包括:

获取模块,用于接收针对服务注册中心的数据存储请求,获取服务注册中心对应的待存储信息集;

第一存储模块,用于将待存储信息集中包含的各待存储服务信息,按照各待存储服务信息各自的待存储服务码,构建当前前缀树,存储各待存储服务信息,并将各待存储服务信息各自的待存储服务码和所属的服务组件单元,存储至倒排索引中,其中,各待存储服务信息是各业务操作的配置信息;

第二存储模块,用于采用哈希表,对待存储信息集中包含的各待存储非服务信息进行存储。

可选的,接收针对服务注册中心的数据存储请求,获取服务注册中心对应的待存储信息集时,获取模块还用于:

当首次对服务注册中心进行数据存储时,调用外部的表格,获得存储信息集;

当服务注册中心重启,且本地的序列化数据集的校验结果为通过时,将序列化数据集作为存储信息集,其中,序列化数据集为采用层次遍历,对历史前缀树进行序列化获得的,校验结果是基于更新日志中最后一次更新操作对应的操作数据,对序列化数据集进行校验获得的,更新日志记录了各历史更新操作各自对应的操作数据;

当服务注册中心重启,且校验结果为不通过时,从服务注册中心中读取历史信息,获得待存储信息集。

可选的,将待存储信息集中包含的各待存储服务信息,按照各待存储服务信息各自的待存储服务码,构建当前前缀树,存储各待存储服务信息,并将各待存储服务信息各自的待存储服务码和所属的服务组件单元,存储至倒排索引中时,第一存储模块还用于:

按照各待存储服务信息各自的待存储服务码,构建当前前缀树,并分别将各待存储服务信息各自的待存储服务码和所属的服务组件单元建立关联,存储至倒排索引中;

针对各待存储服务信息中的每个待存储服务信息,分别执行以下操作:

在当前前缀树中,待存储服务信息的待存储服务码对应的叶子节点处存储待存储服务信息的内容数据,并使用关联指针将叶子节点指向相邻的至少一个叶子节点,以及在叶子节点处存储指向倒排索引中待存储服务码位置的位置指针,其中,叶子节点为没有子节点的节点;

将在当前前缀树中,待存储服务码对应的至少一个非叶子节点各自对应的计数器的累计计数值加1。

可选的,将待存储信息集中包含的各待存储服务信息,按照各待存储服务信息各自的待存储服务码,构建当前前缀树,存储各待存储服务信息,并将各待存储服务信息各自的待存储服务码和所属的服务组件单元,存储至倒排索引中之后,装置还包括查询模块,查询模块用于:

接收服务信息查询请求,服务信息查询请求中携带了本次查询的查询类型和查询字符;

当查询类型为单个查询时,查询当前前缀树中与查询字符匹配的匹配叶子节点,并获得匹配叶子节点中存储的内容数据;

当查询类型为批量查询时,获取批量查询的查询区间,并基于查询字符和查询区间,查询当前前缀树中与查询字符和查询区间匹配的各匹配叶子节点,以及获得各匹配叶子节点中各自存储的内容数据,查询区间为:当前显示页面需要显示的各内容数据的数量区间。

可选的,基于查询字符和查询区间,查询当前前缀树中与查询字符和查询区间匹配的各叶子节点时,查询模块还用于:

查询当前前缀树中与查询字符匹配的匹配非叶子节点,将匹配非叶子节点作为目标节点,并获得目标节点对应的计数器的目标计数值,其中,目标计数值表征存储在目标节点下的各服务信息的总数量;

当查询区间的右边界值不大于目标计数值时,从目标节点下的第一个后继节点进行递归查找,获得与查询区间匹配的各匹配叶子节点;

当查询区间的左边界值大于目标计数值时,从目标节点的最左叶子节点向前进行遍历,并从目标节点的最右叶子节点向后进行遍历,获得与查询区间匹配的各匹配叶子节点。

可选的,将待存储信息集中包含的各待存储服务信息,按照各待存储服务信息各自的待存储服务码,构建前缀树,存储各待存储服务信息,并将各待存储服务信息各自的待存储服务码和所属的服务组件单元,存储至倒排索引中之后,装置还包括更新模块,更新模块用于:

接收针对待更新服务信息的更新请求,将本次更新操作写入更新日志,其中,更新请求中携带了本次更新操作的更新类型;

根据更新类型,更新服务注册中心存储的待更新服务信息,并根据更新日志和更新类型,更新前缀树和倒排索引中存储的待更新服务信息。

可选的,根据日志和更新类型,更新前缀树和倒排索引中存储的待更新服务信息时,更新模块还用于:

当更新类型为删除时,根据待更新服务信息对应的待更新服务码,查询前缀树,获得待更新服务信息的查询结果;

当查询结果表征待更新服务信息存在时,基于查询结果中待更新服务码对应的叶子节点中存储的位置指针,确定在倒排索引中待更新服务码的位置,并删除倒排索引中的待更新服务码;

在前缀树中,删除待更新服务码对应的叶子节点,并针对待更新服务码对应的至少一个非叶子节点中的每个非叶子节点,分别执行以下操作:将非叶子节点对应的计数器的当前计数值减1,获得更新计数值,当更新计数值为0时,将非叶子节点置空。

第三方面,提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述第一方面任一项所述方法的步骤。

第四方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述第一方面任一项所述方法的步骤。

第五方面,提供一种计算机程序产品,所述计算机程序产品包括计算机程序,所述计算机程序存储在计算机可读存储介质中;当电子设备的处理器从计算机可读存储介质读取所述计算机程序时,所述处理器执行所述计算机程序,使得所述电子设备执行上述第一方面任一项所述方法的步骤。

本申请实施例中,接收针对服务注册中心的数据存储请求,获取服务注册中心对应的待存储信息集,然后将待存储信息集中包含的各待存储服务信息,按照各待存储服务信息各自的待存储服务码,构建当前前缀树,存储各待存储服务信息,并将各待存储服务信息各自的待存储服务码和所属的服务组件单元,存储至倒排索引中,并采用哈希表,对待存储信息集中包含的各待存储非服务信息进行存储。

这样,对不同的数量级的数据采用对应的数据结构存储,在内存中通过前缀树存储待存储服务信息,通过倒排索引存储服务码和服务组件单元之间的关联关系,通过哈希表存储待存储非服务信息,完成服务注册中心数据持久化与数据库的解耦,节省一定的人力与硬件成本,当数据库出现故障时,仍能够完成运维与开发工作,提高了数据存储的安全性,并且提高安全性的同时,节约了检索时间,提高了数据检索的效率。

附图说明

图1为本申请实施例中的应用场景示意图;

图2为本申请实施例中一种数据存储方法的流程示意图;

图3为本申请实施例中存储各待存储服务信息的流程示意图;

图4为本申请实施例中构建当前前缀树的第一示意图;

图5为本申请实施例中构建倒排索引的第一示意图;

图6为本申请实施例中构建倒排索引的第二示意图;

图7为本申请实施例中构建当前前缀树的第二示意图;

图8为本申请实施例中构建当前前缀树的第三示意图;

图9为本申请实施例中当前前缀树的示例图;

图10为本申请实施例中查询数据的流程示意图;

图11为本申请实施例中批量查询的流程示意图;

图12为本申请实施例中批量查询的第一示意图;

图13为本申请实施例中批量查询的第二示意图;

图14为本申请实施例中批量查询的第三示意图;

图15为本申请实施例中更新数据的流程示意图;

图16为本申请实施例中删除待更新服务信息的流程示意图;

图17为本申请实施例中删除待更新服务码后的倒排索引中的示意图;

图18为本申请实施例中删除前缀树中的待更新服务码的示意图;

图19为本申请实施例中数据存储装置的结构示意图;

图20为本申请实施例中电子设备的结构示意图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,并不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

为便于理解本申请实施例提供的技术方案,这里先对本申请实施例使用的一些关键名词进行解释:

zookeeper:是一个分布式的,开放源码的分布式应用程序协调服务,是谷歌的分布式文件系统的一个开源的实现,是分布式系统基础架构和开源数据库的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

前缀树:又称单词查找树,是一种树形结构,是一种哈希树的变种。它有3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符;从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;每个节点的所有子节点包含的字符都不相同。

倒排索引:根据属性的值来查找记录,每一项都包括一个属性值和具有该属性值的各记录的地址。

哈希表:根据关键码值而直接进行访问的数据结构。

服务信息:服务信息是服务注册中心的核心信息,其数量级可达到百万。是某个业务操作的配置信息,例如:存款操作的配置信息。

非服务信息:数量级一般不超过万级,包括服务组件单元信息、平台信息和服务注册中心的配置信息等。

下面对本申请实施例的设计思想进行简要介绍:

目前,随着企业业务的快速发展,为了应对大量复杂的业务和庞大的业务数据,越来越多的系统开始采用分布式架构。分布式架构是按照业务边界,将大型单体应用拆分成小型的,且可独立部署的服务单元,通过服务注册中心协同完成复杂的业务逻辑。在银行系统中,普遍采用zookeeper作为服务注册中心。

现有技术中,对服务注册中心的数据进行存储时,通常采用数据库,对服务注册中心的数据持久化存储,同时利用数据库自身的索引和缓存等功能,满足数据的查询等需求。

然而,由于数据库不参与业务处理,数据的同步完全由服务注册中心来完成,因此数据库的利用率较低,数据库系统长期处于闲置状态。并且数据库系统可能由于第三方的原因导致整个数据库系统不可用而使服务注册中心的服务同样陷入风险,安全性不高,同时,数据库系统仍需要配备相应的运维人员,设备资源进行维护,造成资源浪费。

有鉴于此,本申请实施例中,提供一种数据存储方法、装置、电子设备及存储介质,接收针对服务注册中心的数据存储请求,获取服务注册中心对应的待存储信息集,然后将待存储信息集中包含的各待存储服务信息,按照各待存储服务信息各自的待存储服务码,构建前缀树,存储各待存储服务信息,并将各待存储服务信息各自的待存储服务码和所属的服务组件单元,存储至倒排索引中,以及采用哈希表,对待存储信息集中包含的各待存储非服务信息进行存储。这样,对不同的数量级的数据采用对应的数据结构存储,在内存中通过前缀树存储待存储服务信息,通过倒排索引存储服务码和服务组件单元之间的关联关系,通过哈希表存储待存储非服务信息,完成服务注册中心数据持久化与数据库的解耦,节省一定的人力与硬件成本,当数据库出现故障时,仍能够完成运维与开发工作,提高了数据存储的安全性,并且提高安全性的同时,减少了时间复杂度,实现快速检索,快速迭代。

下面结合附图对本申请优选的实施方式进行详细介绍。

参阅图1所示,为本申请实施例中可能的应用场景示意图。该应用场景图中,包括服务器110,以及终端设备120(包括终端设备1201、终端设备1202…终端设备120n)。

服务器110可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(Content Delivery Network,CDN)、以及大数据和人工智能平台等基础云计算服务的云服务器。终端设备120与服务器110可以通过有线或无线通信方式进行直接或间接地连接,本申请在此不做限制。

终端设备120包括但不限于手机、平板电脑、笔记本电脑、台式电脑、电子书阅读器、智能语音交互设备、智能家电、车载终端等设备;终端设备上可以安装各种软件,比如应用程序和小程序等。

需要说明的是,图1所示只是举例说明,实际上终端设备120和服务器110的数量不受限制,在本申请实施例中不做具体限定。

基于上述实施例,参阅图2所示,为本申请实施例中一种数据存储方法的流程示意图,具体包括:

步骤20:接收针对服务注册中心的数据存储请求,获取服务注册中心对应的待存储信息集。

本申请实施例中,服务器响应于针对服务注册中心的数据存储请求,获取服务注册中心对应的待存储信息集。

其中,获取服务注册中心对应的待存储信息集有以下三种方式:

方式一:当首次对服务注册中心进行数据存储时,调用外部的表格,获得存储信息集。

方式二:当服务注册中心重启,且本地的序列化数据集的校验结果为通过时,将序列化数据集作为存储信息集。

其中,序列化数据集为采用层次遍历,对历史前缀树进行序列化获得的,校验结果是基于更新日志中最后一次更新操作对应的操作数据,对序列化数据集进行校验获得的,更新日志记录了各历史更新操作各自对应的操作数据。

本申请实施例中,当服务注册中心重启时,校验本地的序列化数据集,若序列化数据集的校验结果为通过,则将序列化数据集作为存储信息集。

具体的,获得序列化数据集的校验结果时,对比更新日志中最后一次更新操作对应的操作数据与序列化数据集中相应的序列化数据是否一致,若一致,则确定序列化数据集的校验结果为通过,否则,则确定序列化数据集的校验结果为不通过。

例如,假设更新日志中最后一次更新操作对应的操作数据为新增服务码为A10815421的服务信息,查询序列化数据集中相应的序列化数据保存有A10815421的服务信息,则确定序列化数据集的校验结果为通过。

这样,服务注册中心作为业务流程中的交易地址信息提供方,其数据的准确性和实时性会直接影响到交易的成功率。因此在更新数据时,服务注册中心内的数据应优先更新,若有数据不一致应以服务注册中心数据为准,因此,每次更新数据时,将更新操作各自对应的操作数据存储至更新日志,之后通过更新日志,校验序列化数据集,提高了存储数据的准确性。

方式三:当服务注册中心重启,且校验结果为不通过时,从服务注册中心中读取历史信息,获得待存储信息集。

本申请实施例中,当服务注册中心重启时,校验本地的序列化数据集,若序列化数据集的校验结果为不通过,则从服务注册中心中读取历史信息,获得待存储信息集。

步骤21:将待存储信息集中包含的各待存储服务信息,按照各待存储服务信息各自的待存储服务码,构建当前前缀树,存储各待存储服务信息,并将各待存储服务信息各自的待存储服务码和所属的服务组件单元,存储至倒排索引中。

其中,各待存储服务信息是各业务操作的配置信息,针对银行系统,业务操作可以为存款、转账等虚拟资源操作,配置信息可以为调用信息、说明信息和地址信息等,本申请实施例对此并不进行限制。

具体的,在执行步骤21时,服务器具体执行以下操作。参阅图3所示,其为本申请实施例中存储各待存储服务信息的流程示意图,下面结合附图3,对具体执行的操作进行详细说明:

步骤210:按照各待存储服务信息各自的待存储服务码,构建当前前缀树,并分别将各待存储服务信息各自的待存储服务码和所属的服务组件单元建立关联,存储至倒排索引中。

例如,参阅图4所示,为本申请实施例中构建当前前缀树的第一示意图,假设各待存储服务信息各自的待存储服务码包括:A10815420、A10815421、A10815422、A1Z54S42Y、A1Z54S42Z,则构建当前前缀树,各待存储服务信息各自的待存储服务码拥有共同的前缀A1,当前前缀树在待存储服务码的第三位开始出现分叉,前三个服务码拥有共同的前缀A1081542,在最后一个字符出现差异,当前前缀树在叶节点出现分叉,后两个服务码拥有共同的前缀A1Z54S42,在最后一个字符出现差异,当前前缀树在叶节点出现分叉。

其中,初始构建倒排索引时,存储结构为哈希表加链表的形式,哈希表的键key为服务组件单元编号,值value为链表。

例如,参阅图5所示,为本申请实施例中构建倒排索引的第一示意图,假设各待存储服务信息各自的待存储服务码包括:A10815420、A10815421、A10815422、A1Z54S42Y、A1Z54S42Z,A10815420、A10815421和A10815422所属的服务组件单元为A1081,A1Z54S42Z和A10815420所属的服务组件单元为A1Z54,则哈希表中,键A1081关联的值为:A10815420、A10815421和A10815422的链表,键A1Z54关联的值为A1Z54S42Z和A10815420的链表。

由于服务注册中心属于读多写少的系统,因此完成倒排索引的构建后,为了加快查询速度,可以将链表转化成数组。

例如,参阅图6所示,为本申请实施例中构建倒排索引的第二示意图,将哈希表中,键A1081关联的值转化为[A10815420,A10815421,A10815422],键A1Z54关联的值转化为[A1Z54S42Z,A10815420]。

针对各待存储服务信息中的每个待存储服务信息,分别执行以下操作:

步骤211:在当前前缀树中,待存储服务信息的待存储服务码对应的叶子节点处存储待存储服务信息的内容数据,并使用关联指针将叶子节点指向相邻的至少一个叶子节点,以及在叶子节点处存储指向倒排索引中待存储服务码位置的位置指针。

其中,叶子节点为没有子节点的节点。

例如,参阅图7所示,为本申请实施例中构建当前前缀树的第二示意图,在当前前缀树中,待存储服务信息的待存储服务码A10815421对应的叶子节点处存储待存储服务信息的内容数据,并使用关联指针将A10815421对应的叶子节点指向相邻的叶子节点A10815420和叶子节点A10815422,以及在A10815421对应的叶子节点处存储指向倒排索引中待存储服务码A10815421位置的位置指针。

这样,在利用前缀树的特性,对每一个非叶节点增加一个计数器,并使用关联指针将所有的叶子节点进行相连,形成一个双向无环链表,可以实现快速分页查询。

步骤212:将在当前前缀树中,待存储服务码对应的至少一个非叶子节点各自对应的计数器的累计计数值加1。

例如,参阅图8所示,为本申请实施例中构建当前前缀树的第三示意图,在当前前缀树中,将存储待存储服务码A10815421经过的至少一个非叶子节点各自对应的计数器的累计计数值加1,节点A对应的计数器的累计计数值为2233+1=2234。

本申请实施例中,当将所有的存储待存储服务码都加入前缀树后,每一个非叶子节点上的累计计数值表示该非叶子节点下的服务码数量。

进一步地,在构建当前前缀树,存储各待存储服务信息之后,需要采用层次遍历,对当前前缀树进行序列化,获得序列化数据。

例如,参阅图9所示,为本申请实施例中当前前缀树的示例图,示例节点的字母表示该示例节点包含的所有服务信息,每个示例节点的孩子节点的总数量不超过3个,且边的取值从左到右分别为0、1、2,将当前前缀树进行序列化,在进行序列化时,若一个示例节点的孩子节点的个数小于3,则将该示例节点没有的孩子节点的边值写入,记为NULL。比如,节点B没有边值为1的孩子节点,当层次遍历到节点B的各孩子节点时,记录的信息为:E,NULL,F。当前前缀树对应的序列化数据为:[A,B,C,D,E,NULL,F,NULL,G,NULL,H,I,J,NULL,NULL,NULL,NULL,NULL,NULL,NULL,K,L]。

这样,获得序列化数据,将序列化数据持久化到磁盘,防止因系统故障导致的数据丢失,提高了数据存储的安全性。

步骤22:采用哈希表,对待存储信息集中包含的各待存储非服务信息进行存储。

本申请实施例中,采用哈希表,对待存储信息集中包含的各待存储非服务信息进行存储,哈希表的键为信息标识,值为信息内容。

这样,针对低数量级的非服务信息,可以根据键快速获取对应信息,或者对哈希表进行遍历获取信息。

进一步地,在存储待存储信息之后,会对数据进行查询,服务器具体执行以下操作。参阅图10所示,其为本申请实施例中查询数据的流程示意图,下面结合附图10,对具体执行的操作进行详细说明:

步骤1001:接收服务信息查询请求。

其中,服务信息查询请求中携带了本次查询的查询类型和查询字符。

本申请实施例中,响应于终端设备的查询请求,获取查询对象输入的查询字符,当查询字符为清楚字符时,确定查询类型为单个查询,当查询字符为模糊字符时,确定查询类型为批量查询。

步骤1002:采用查询类型对应的查询方式,获得本次查询的内容数据。

具体的,包括以下两种查询方式:

方式一:当查询类型为单个查询时,查询前缀树中与查询字符匹配的匹配叶子节点,并获得匹配叶子节点中存储的内容数据。

本申请实施例中,当查询类型为单个查询时,从当前前缀树的根节点开始查找,依次查找到根节点下与查询字符匹配的后继节点,当无匹配叶子节点时,查询字符不存在,返回提示信息,当有匹配叶子节点时,查询字符存在,返回匹配叶子节点中存储的内容数据。

例如,当查询字符为A10815421时,从根节点开始查找,依次查找到根节点下的A分支,再找到该A分支下的1分支,然后找到该1分支下的0分支,以此类推,直至找到A10815421对应的叶子节点。

方式二:当查询类型为批量查询时,获取批量查询的查询区间,并基于查询字符和查询区间,查询当前前缀树中与查询字符和查询区间匹配的各匹配叶子节点,以及获得各匹配叶子节点中各自存储的内容数据。

其中,查询区间为:当前显示页面需要显示的各内容数据的数量区间。

具体的,基于查询字符和查询区间,查询当前前缀树中与查询字符和查询区间匹配的各匹配叶子节点时,服务器具体执行以下操作。参阅图11所示,其为本申请实施例中批量查询的流程示意图,下面结合附图11,对具体执行的操作进行详细说明:

步骤1101:查询当前前缀树中与查询字符匹配的匹配非叶子节点,将匹配非叶子节点作为目标节点,并获得目标节点对应的计数器的目标计数值。

本申请实施例中,从当前前缀树的根节点开始查找,依次查找到根节点下与查询字符匹配的非叶子节点,将匹配非叶子节点作为目标节点,并获得目标节点对应的计数器的目标计数值。

例如,参阅图12所示,为本申请实施例中批量查询的第一示意图,假设查询字符为A1,查询当前前缀树中与查询字符匹配的匹配非叶子节点为节点A1,将节点A1作为目标节点,并获得目标节点对应的计数器的目标计数值为482。

其中,目标计数值表征存储在目标节点下的各服务信息的总数量。

步骤1102:基于查询区间的右边界值和左边界值,以及目标计数值的大小,采用相应的子查询方式,获得与查询区间匹配的各匹配叶子节点。

具体的,子查询方式包括以下三种方式:

方式一:当查询区间的右边界值不大于目标计数值时,从目标节点下的第一个后继节点进行递归查找,获得与查询区间匹配的各匹配叶子节点。

例如,假设分页展示的条数为10条,查询字符为A1,查询区间为第11-20条的服务信息,目标计数值为482,第一个后继节点为节点A10,则查询区间的右边界值20不大于目标计数值482,从节点A10开始递归查找,获得与查询区间匹配的各匹配叶子节点。

具体的,判断目标节点下的第一个后继节点对应的计数器的子目标计数值是否大于右边界值,当子目标计数值大于右边界值时,从第一个后继节点下的后继节点开始递归查找,获得与查询区间匹配的各匹配叶子节点。

例如,如图12所示,假设查询字符为A1,查询区间为第11-20条的服务信息,目标计数值为482,第一个后继节点为节点A10,将节点A10作为子目标节点,节点A10对应的计数器的子目标计数值为61,则子目标计数值为61大于右边界值20,直接从节点A10下的后继节点开始递归查找,获得与查询区间匹配的各匹配叶子节点。

又例如,参阅图13所示,为本申请实施例中批量查询的第二示意图,假设查询字符为A1,查询区间为第61-70条的服务信息,目标计数值为482,第一个后继节点为节点A10,节点A10对应的计数器的子目标计数值为61,节点A11对应的计数器的子目标计数值为38,则在A10节点下的后继节点中找到最后一个叶子节点,并在节点A11下的后继节点中递归寻找第1-9个叶子节点,从而获得与查询区间匹配的各匹配叶子节点。

方式二:当查询区间的左边界值大于目标计数值时,从目标节点的最左叶子节点向前进行遍历,并从目标节点的最右叶子节点向后进行遍历,获得与查询区间匹配的各匹配叶子节点。

本申请实施例中,当查询区间的左边界值大于目标计数值时,可以先从目标节点的最左叶子节点向前进行遍历,若没有获得查询区间匹配的各匹配叶子节点,再从目标节点的最右叶子节点向后进行遍历,获得与查询区间匹配的各匹配叶子节点。也可以先从目标节点的最右叶子节点向后进行遍历,若没有获得查询区间匹配的各匹配叶子节点,再从目标节点的最左叶子节点向前进行遍历,获得与查询区间匹配的各匹配叶子节点。

例如,参阅图14所示,为本申请实施例中批量查询的第三示意图,假设查询字符为A1,查询区间为第490-500条的服务信息,目标计数值为482,目标节点的最左叶子节点为节点A10815420,目标节点的最右叶子节点为节点A1Z54S42Z,则查询区间的左边界值490大于目标计数值482,从节点A10815420向前进行遍历,并从节点A1Z54S42Z向后进行遍历,获得与查询区间匹配的各匹配叶子节点。

另外,值得说明的是,当查询字符为后缀或者中间字符时,会出现查询区间的右边界值大于目标计数值的情况。

方式三:当左边界值不大于目标计数值,且右边界值大于目标计数值时,将查询区间按照目标计数值进行分段,获得第一子区间和第二子区间,并将第一子区间按照方式一进行查询,获得与第一子区间匹配的各匹配叶子节点,以及将第二子区间按照方式二进行查询,获得与第二子区间匹配的各匹配叶子节点。

例如,假设查询字符为A1,查询区间为第481-490条的服务信息,目标计数值为482,则左边界值481不大于目标计数值482,且右边界值490大于目标计数值482,将查询区间按照目标计数值482进行分段,获得第一子区间为第481-482条的服务信息,第二子区间为第483-490条的服务信息,将第一子区间按照方式一进行查询,获得与第一子区间匹配的各匹配叶子节点,以及将第二子区间按照方式二进行查询,获得与第二子区间匹配的各匹配叶子节点。

这样,通过比较查询区间的右边界值和左边界值,以及目标计数值的大小,减少了时间复杂度,能够节约检索时间,实现快速检索。

进一步地,在存储待存储信息之后,会对数据进行更新,服务器具体执行以下操作。参阅图15所示,其为本申请实施例中更新数据的流程示意图,下面结合附图15,对具体执行的操作进行详细说明:

步骤1501:接收针对待更新服务信息的更新请求,将本次更新操作写入更新日志。

其中,更新请求中携带了本次更新操作的更新类型。

本申请实施例中,服务器接收针对待更新服务信息的更新请求,获取本次更新操作的更新类型,并将本次更新操作写入更新日志。

另外,值得说明的是,更新类型可以为删除服务信息、修改服务信息和增加服务信息。

步骤1502:根据更新类型,更新服务注册中心存储的待更新服务信息,并根据更新日志和更新类型,更新前缀树和倒排索引中存储的待更新服务信息。

本申请实施例中,将本次更新操作写入更新日志之后,更新服务注册中心存储的待更新服务信息的同时,更新前缀树和倒排索引中存储的待更新服务信息。

例如,假设本次更新操作为:增加服务码为A10815423的服务信息,则在服务注册中心存储增加服务码为A10815423的服务信息的同时,在前缀树中增加服务码A10815423和其服务信息,以及在倒排索引中增加服务码A10815423。

这样,通过更新日志,将服务注册中心的数据与前缀树和倒排索引的数据进行统一,实现了数据一致性。

具体的,在更新类型为删除时,根据更新日志和更新类型,更新前缀树和倒排索引中存储的待更新服务信息,服务器具体执行以下操作。参阅图16所示,其为本申请实施例中删除待更新服务信息的流程示意图,下面结合附图16,对具体执行的操作进行详细说明:

步骤1502-1:当更新类型为删除时,根据待更新服务信息对应的待更新服务码,查询前缀树,获得待更新服务信息的查询结果。

本申请实施例中,判断更新类型是否为删除,当更新类型为删除时,根据待更新服务信息对应的待更新服务码,查询前缀树,若查询到待更新服务码,则确定待更新服务信息存在,并记录待更新服务码对应的叶子节点,若未查询到待更新服务码,则确定待更新服务信息不存在。

步骤1502-2:当查询结果表征待更新服务信息存在时,基于查询结果中待更新服务码对应的叶子节点中存储的位置指针,确定在倒排索引中待更新服务码的位置,并删除倒排索引中的待更新服务码。

本申请实施例中,判断查询结果表征待更新服务信息存在,当查询结果表征待更新服务信息存在时,基于查询结果中待更新服务码对应的叶子节点中存储的位置指针,确定在倒排索引中待更新服务码的位置,并删除值为链表的倒排索引中的待更新服务码、以及同时删除值为数组的倒排索引中的待更新服务码。

例如,参阅图17所示,为本申请实施例中删除待更新服务码后的倒排索引中的示意图,假设待更新服务码为A10815421,确定在倒排索引中待更新服务码所属的服务组件单元为A1081,并删除值为链表的倒排索引中的A10815421,以及同时删除值为数组的倒排索引中的A10815421。

步骤1502-3:在前缀树中,删除待更新服务码对应的叶子节点,并针对待更新服务码对应的至少一个非叶子节点中的每个非叶子节点,分别执行以下操作:将非叶子节点对应的计数器的当前计数值减1,获得更新计数值,当更新计数值为0时,将非叶子节点置空。

例如,参阅图18所示,为本申请实施例中删除前缀树中的待更新服务码的示意图,假设待更新服务码为A10815421,待更新服务码A10815421对应的叶子节点为节点A10815421,待更新服务码A10815421对应的至少一个非叶子节点分别为:根节点、节点A、节点A1、节点A10、节点A108、节点A1081、节点A10815、节点A108154、节点A1081542,待更新服务码A10815421对应的至少一个非叶子节点各自的当前计数值分别为16346、2234、482、61、30、20、10、1,则删除节点A10815421,将各非叶子节点对应的计数器的当前计数值减1,获得各非叶子节点对应的计数器的更新计数值分别为:16345、2233、481、60、29、19、9、0,并将节点A1081542置空。

基于相同的发明构思,本申请实施例中还提供了一种数据存储装置,参阅图19所示,为本申请实施例中数据存储装置的结构示意图,具体包括:

获取模块1901,用于接收针对服务注册中心的数据存储请求,获取服务注册中心对应的待存储信息集;

第一存储模块1902,用于将待存储信息集中包含的各待存储服务信息,按照各待存储服务信息各自的待存储服务码,构建当前前缀树,存储各待存储服务信息,并将各待存储服务信息各自的待存储服务码和所属的服务组件单元,存储至倒排索引中,其中,各待存储服务信息是各业务操作的配置信息;

第二存储模块1903,用于采用哈希表,对待存储信息集中包含的各待存储非服务信息进行存储。

可选的,接收针对服务注册中心的数据存储请求,获取服务注册中心对应的待存储信息集时,获取模块1901还用于:

当首次对服务注册中心进行数据存储时,调用外部的表格,获得存储信息集;

当服务注册中心重启,且本地的序列化数据集的校验结果为通过时,将序列化数据集作为存储信息集,其中,序列化数据集为采用层次遍历,对历史前缀树进行序列化获得的,校验结果是基于更新日志中最后一次更新操作对应的操作数据,对序列化数据集进行校验获得的,更新日志记录了各历史更新操作各自对应的操作数据;

当服务注册中心重启,且校验结果为不通过时,从服务注册中心中读取历史信息,获得待存储信息集。

可选的,将待存储信息集中包含的各待存储服务信息,按照各待存储服务信息各自的待存储服务码,构建当前前缀树,存储各待存储服务信息,并将各待存储服务信息各自的待存储服务码和所属的服务组件单元,存储至倒排索引中时,第一存储模块1902还用于:

按照各待存储服务信息各自的待存储服务码,构建当前前缀树,并分别将各待存储服务信息各自的待存储服务码和所属的服务组件单元建立关联,存储至倒排索引中;

针对各待存储服务信息中的每个待存储服务信息,分别执行以下操作:

在当前前缀树中,待存储服务信息的待存储服务码对应的叶子节点处存储待存储服务信息的内容数据,并使用关联指针将叶子节点指向相邻的至少一个叶子节点,以及在叶子节点处存储指向倒排索引中待存储服务码位置的位置指针,其中,叶子节点为没有子节点的节点;

将在当前前缀树中,待存储服务码对应的至少一个非叶子节点各自对应的计数器的累计计数值加1。

可选的,将待存储信息集中包含的各待存储服务信息,按照各待存储服务信息各自的待存储服务码,构建当前前缀树,存储各待存储服务信息,并将各待存储服务信息各自的待存储服务码和所属的服务组件单元,存储至倒排索引中之后,装置还包括查询模块1904,查询模块1904用于:

接收服务信息查询请求,服务信息查询请求中携带了本次查询的查询类型和查询字符;

当查询类型为单个查询时,查询当前前缀树中与查询字符匹配的匹配叶子节点,并获得匹配叶子节点中存储的内容数据;

当查询类型为批量查询时,获取批量查询的查询区间,并基于查询字符和查询区间,查询当前前缀树中与查询字符和查询区间匹配的各匹配叶子节点,以及获得各匹配叶子节点中各自存储的内容数据,查询区间为:当前显示页面需要显示的各内容数据的数量区间。

可选的,基于查询字符和查询区间,查询当前前缀树中与查询字符和查询区间匹配的各叶子节点时,查询模块1904还用于:

查询当前前缀树中与查询字符匹配的匹配非叶子节点,将匹配非叶子节点作为目标节点,并获得目标节点对应的计数器的目标计数值,其中,目标计数值表征存储在目标节点下的各服务信息的总数量;

当查询区间的右边界值不大于目标计数值时,从目标节点下的第一个后继节点进行递归查找,获得与查询区间匹配的各匹配叶子节点;

当查询区间的左边界值大于目标计数值时,从目标节点的最左叶子节点向前进行遍历,并从目标节点的最右叶子节点向后进行遍历,获得与查询区间匹配的各匹配叶子节点。

可选的,将待存储信息集中包含的各待存储服务信息,按照各待存储服务信息各自的待存储服务码,构建前缀树,存储各待存储服务信息,并将各待存储服务信息各自的待存储服务码和所属的服务组件单元,存储至倒排索引中之后,装置还包括更新模块1905,更新模块1905用于:

接收针对待更新服务信息的更新请求,将本次更新操作写入更新日志,其中,更新请求中携带了本次更新操作的更新类型;

根据更新类型,更新服务注册中心存储的待更新服务信息,并根据更新日志和更新类型,更新前缀树和倒排索引中存储的待更新服务信息。

可选的,根据日志和更新类型,更新前缀树和倒排索引中存储的待更新服务信息时,更新模块1905还用于:

当更新类型为删除时,根据待更新服务信息对应的待更新服务码,查询前缀树,获得待更新服务信息的查询结果;

当查询结果表征待更新服务信息存在时,基于查询结果中待更新服务码对应的叶子节点中存储的位置指针,确定在倒排索引中待更新服务码的位置,并删除倒排索引中的待更新服务码;

在前缀树中,删除待更新服务码对应的叶子节点,并针对待更新服务码对应的至少一个非叶子节点中的每个非叶子节点,分别执行以下操作:将非叶子节点对应的计数器的当前计数值减1,获得更新计数值,当更新计数值为0时,将非叶子节点置空。

基于上述实施例,参阅图20所示为本申请实施例中电子设备的结构示意图。

本申请实施例提供了一种电子设备,该电子设备可以包括处理器2010(CenterProcessing Unit,CPU)、存储器2020、输入设备2030和输出设备2040等,输入设备2030可以包括键盘、鼠标、触摸屏等,输出设备2040可以包括显示设备,如液晶显示器(LiquidCrystal Display,LCD)、阴极射线管(Cathode Ray Tube,CRT)等。

存储器2020可以包括只读存储器(ROM)和随机存取存储器(RAM),并向处理器2010提供存储器2020中存储的程序指令和数据。在本申请实施例中,存储器2020可以用于存储本申请实施例中任一种数据存储方法的程序。

处理器2010通过调用存储器2020存储的程序指令,处理器2010用于按照获得的程序指令执行本申请实施例中任一种数据存储方法。

基于上述实施例,本申请实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任意方法实施例中的数据存储方法。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

相关技术
  • 一种即时通信的数据存储方法、装置、电子设备和介质
  • 多版本数据存储管理方法及装置、电子设备、存储介质
  • 海量数据存储方法、装置、存储介质及电子设备
  • 数据存储方法、装置、电子设备及存储介质
  • 一种数据存储方法及装置、一种计算设备及存储介质
  • 数据存储方法、数据存储装置、电子设备、存储介质
  • 数据存储装置、服务器、数据存储方法、电子设备和介质
技术分类

06120116504936