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

一种对象存储有序列举方法、装置、终端及存储介质

文献发布时间:2023-06-19 13:45:04


一种对象存储有序列举方法、装置、终端及存储介质

技术领域

本发明涉及对象存储有序列举领域,具体涉及一种对象存储有序列举方法、装置、终端及存储介质。

背景技术

随着互联网的发展,互联网数据量(非结构化数据)越来越大,分布式对象存储应运而生。这种新兴的存储方式,适用于图片、视频等非结构化数据的存储。它同时又具有块存储高速直接访问磁盘的特点以及文件存储分布式共享的特点,因此一经推出就得到广泛的发展与应用。

对象列举操作可以使用户方便的查看桶内的对象以及对象的属性。而对象存储作为分布存储,客户通常在存储桶内存储百万以及千万的对象,对于如此大规模的数据,在保证不严重影响集群性能的同时快速查看桶内的对象显得非常重要。对象存储创建桶的时候会在索引池创建指定个数(默认为128个)的索引对象,上传对象的时候会将对象名和对象的属性通过哈希的方式存储在桶索引的omap的键值对中。遍历桶内对象的时候通过遍历桶索引上记录的对象完成。目前对象存储有序列举和无序列举两种,有序列举需要从所有桶索引遍历对象,将所有索引上对象排序后保证得到一个有序排序结果,而无序列举按照分片顺序分别遍历桶内对象。

当桶内数量较大以后,一次遍历完所有对象并返回结果给客户无论从集群性能以及网络而言都不太现实,大规模数据的排序会造成内存暴涨以及增加网络传输失败的概率。故目前对象存储采用分页排序的方法。对象有序遍历而言,默认每次列举 1000个对象,每次向所有桶分片(默认为128个)从标识对象位置向后读1000个对象,从128*1000中对象中排序选出前1000个对象,作为本次有序列举的结果。将排序的1000个对象的最后一个对象作为新的对象标识,下次遍历是从该新的对象标识开始继续遍历。这种方案,每次从底层读1000*128个对象,却只得到1000个有序排序的结果,下次读的时候继续从底层读1000*128个对象,对于排序1000后的127*1000的结果并未合理利用,用户通常会新的对象标识完桶内所有对象,故目前方案会导致频繁的对底层(一般为硬盘)进行访问,浪费系统资源。

发明内容

为解决上述问题,本发明提供一种对象存储有序列举方法、装置、终端及存储介质,将剩余的对象存入一缓存map中,过缓存map将剩余对象存入内存,有新的列举请求时,若所需列举对象在缓存map中,则从缓存map中提取即可,充分利用剩余对象,且减少与底层的交互,降低集群压力,同时直接从内存中度,显著提高列举速度。

第一方面,本发明的技术方案提供一种对象存储有序列举方法,每次列举N个对象,每个桶有M个桶分片,N和M均为大于等于1的整数,该方法包括以下步骤:

接收到客户端的列举请求时,检测缓存map中是否包含所需列举对象对应桶的缓存;

若不包含,则从底层相应桶的M个桶分片中读取M*N个对象,每个桶分片读取N个对象,从该M*N个对象中有序列举N个对象发送至客户端,并将剩余(M-1)*N个对象存至缓存map中;该剩余(M-1)*N个对象为该桶在缓存map中的缓存;

若包含,则从对应桶的缓存中有序列举N个对象发送至客户端。

进一步地,缓存map中所缓存数据以键值对形式存储,其中键值对的键为桶名称,值为桶分片地址和桶分片对象的组合。

进一步地,客户端的列举请求中包含列举标识,所需列举对象为该列举标识之后的N个对象;列举标识为对象名称;

若缓存map中包含所需列举对象对应桶的缓存时,从对应桶的缓存中有序列举N个对象前,包括以下步骤:

将列举请求中包含的列举标识与桶缓存的每个桶分片的头尾对象进行比较;

若对于某个桶分片,列举标识不满足大于等于该桶分片的第一个对象,且小于等于该桶分片的最后一个对象,则从底层相应桶分片中重新获取N个对象存入该缓存的桶分片;其中第一个对象为头对象,最后一个对象为尾对象;

若重新存入该桶分片的对象仍不满足列举标识大于等于第一个对象,且小于等于最后一个对象,则继续从底层相应桶分片中重新获取N个对象存入该缓存的桶分片,直至该桶分片的对象满足列举标识大于等于第一个对象,且小于等于最后一个对象。

进一步地,从对应桶的缓存中有序列举N个对象,具体包括:

根据列举请求中的列举标识,从每个桶分片中取出该列表标识之后第一个对象,共取出M个对象,从该M个对象中取出最大的对象为第一个列举对象;

将第一列举对象的名称作为新的列举标识,从每个桶分片中取出该新的列表标识之后第一个对象,共取出M个对象,从该M个对象中取出最大的对象为第二个列举对象;

以此类推,直到取出N个列举对象。

进一步地,该方法还包括以下步骤:

将每次从缓存map中有序列举的N个对象从缓存map中删除。

进一步地,该方法还包括以下步骤:

若缓存map中某个桶分片的对象使用完时,从底层相应桶分片中重新获取N个对象存入该缓存的桶分片;

或,实时检测缓存map中各个桶分片剩余对象的个数H,若某个桶分片剩余对象的个数H小于等于阈值,则从底层相应桶分片中重新获取N个对象存储该缓存的桶分片;

或,实时检测缓存map中各个桶分片剩余对象的个数H,若某个桶分片剩余对象的个数H小于等于阈值,则从底层相应桶分片中重新获取N-H个对象存储该缓存的桶分片。

进一步地,从底层相应桶分片中重新获取的N个对象或N-H个对象为上次获取的所有对象中最后一个对象之后的N个对象或N-H个对象。

第二方面,本发明的技术方案提供一种对象存储有序列举装置,每次列举N个对象,每个桶有M个桶分片,N和M均为大于等于1的整数,该装置包括,

桶缓存检测模块:接收到客户端的列举请求时,检测缓存map中是否包含所需列举对象对应桶的缓存;

底层列举模块:若不包含,则从底层相应桶的M个桶分片中读取M*N个对象,每个桶分片读取N个对象,从该M*N个对象中有序列举N个对象发送至客户端,并将剩余(M-1)*N个对象存至缓存map中;该剩余(M-1)*N个对象为该桶在缓存map中的缓存;

缓存列举模块:若包含,则从对应桶的缓存中有序列举N个对象发送至客户端。

第三方面,本发明的技术方案提供一种终端,包括:

处理器;

用于存储处理器的执行指令的存储器;

其中,所述处理器被配置为执行上述任一项所述的方法。

第四方面,本发明的技术方案提供一种存储有计算机程序的计算机可读存储介质,该程序被处理器执行时实现如上述任一项所述的方法。

本发明提供的一种对象存储有序列举方法、装置、终端及存储介质,相对于现有技术,具有以下有益效果:通过借助缓存 map将上次从底层桶分片上遍历的N个对象中未利用的部分缓存到内存中,从而在用户连续列举这种用户最常见的对象列举方式中,可以在下组列举时直接利用之前从底层读的剩余对象遍历结果。相对于之前每次列举N个对象都需要从底层得到桶分片数*N个对象的方法,本发明一方面可以减少和底层的交互,减少集群压力;另一方面,直接从内存读,相对于之前从底层(硬盘)读的方式,可以显著提高列举的速度。

附图说明

为了更清楚的说明本申请实施例或现有技术的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例一提供的一种对象存储有序列举方法流程示意图。

图2为本发明实施例二提供的一种对象存储有序列举装置结构示意框图。

图3为本发明实施例三提供的一种终端的结构示意图。

具体实施方式

以下对本发明涉及的相关术语进行解释。

对象存储:是一种新的网络存储架构,同时兼具SAN(Storage Area Network,存储区域网络)高速直接访问磁盘特点及NAS(Network Attached Storage,网络附加存储)的分布式共享特点,具有较广的应用前景与应用价值。

桶分片:RGW(Rados Gateway,对象存储网关)中桶的索引对象的分片,用于记录桶内对象以及对象相关信息。

为了使本技术领域的人员更好地理解本申请方案,下面结合附图和具体实施方式对本申请作进一步的详细说明。显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

对于对象有序遍历而言,默认每次列举 1000个对象,每次向所有桶分片(默认为128个)从标识对象位置向后读1000个对象,从128*1000中对象中排序选出前1000个对象,作为本次有序列举的结果。将排序的1000个对象的最后一个对象作为新的对象标识,下次遍历是从该新的对象标识开始继续遍历。这种方案,每次从底层读1000*128个对象,却只得到1000个有序排序的结果,下次读的时候继续从底层读1000*128个对象,对于排序1000后的127*1000的结果并未合理利用,用户通常会新的对象标识完桶内所有对象,故目前方案会导致频繁的对底层(一般为硬盘)进行访问,浪费系统资源。

因此,本发明提供一种对象存储有序列举方案,将剩余的对象存入一缓存map中,通过缓存map将剩余对象存入内存,有新的列举请求时,若所需列举对象在缓存map中,则从缓存map中提取即可,充分利用剩余对象,且减少与底层的交互,降低集群压力,同时直接从内存中读,显著提高列举速度。

实施例一

本实施例一提供一种对象存储有序列举方法,假设每次列举N个对象,每个桶有M个桶分片,N和M均为大于等于1的整数,当然,目前N的取值一般为1000,M的取值一般为128。

如图1所示为本实施例一提供的一种对象存储有序列举方法流程示意图,包括以下步骤。

S101,接收到客户端的列举请求时,检测缓存map中是否包含所需列举对象对应桶的缓存;

S102,若不包含,则从底层相应桶的M个桶分片中读取M*N个对象,每个桶分片读取N个对象,从该M*N个对象中有序列举N个对象发送至客户端,并将剩余(M-1)*N个对象存至缓存map中;该剩余(M-1)*N个对象为该桶在缓存map中的缓存;

S103,若包含,则从对应桶的缓存中有序列举N个对象发送至客户端。

即当接收到客户端发送来列举对象时,首先查看所需列举对象对应桶的缓存是否在缓存map中,若在缓存map中,则直接在缓存map中读取出所需列举对象即可,若不在缓存map中,则需要从底层相应桶中读取列举对象。例如第一次列举某个桶内对象时,缓存map中无该桶的缓存。在底层读取列举对象时,使用传统的有序列举方法即可,即先取出M*N个对象,再从这M*N个对象有序列举N个对象发送至客户端。这样会剩余(M-1)*N个对象,将这剩余的(M-1)*N个对象存至缓存map中,即组成缓存map中的数据,也即对应桶的缓存。

本实施例一提供的对象存储有序列举方法,通过借助缓存 map将上次从底层桶分片上遍历的N个对象中未利用的部分缓存到内存中,从而在用户连续列举这种用户最常见的对象列举方式中,可以在下组列举时直接利用之前从底层读的剩余对象遍历结果。相对于之前每次列举N个对象都需要从底层得到桶分片数*N个对象的方法,本发明一方面可以减少和底层的交互,减少集群压力;另一方面,直接从内存读,相对于之前从底层(硬盘)读的方式,可以显著提高列举的速度。

缓存map中的所缓存数据是以键值对形式存储的,本实施例中剩余(M-1)*N个对象存至缓存map中,形成键值对,其中键值对的键为桶名称,值为桶分片地址和桶分片对象的组合。具体为<桶名,<桶分片地址,桶分片对象>>。

上述步骤S101中检测缓存map中是否包含所需列举对象对应桶的缓存即可根据键值对的键来查找。后续步骤S103中,从对应桶的缓存中有序列举N个对象时也根据键值对查找。

需要说明的是,剩余(M-1)*N个对象存入缓存map中时仍然是以原桶分片进行分片的,即仍包含M个桶分片,经第一次取走N个对象后,每个通分片的个数少于N个。例如N为1000,M为128,第一次取走1000个对象后,某个桶分片中可能剩余990个对象,即从该桶分片中取走了10个对象。

若对应桶的缓存存在于缓存map中,接收到列举命令时,仍然需要检测桶缓存中是否可完整取出所需列举对象。具体实施中,通过对每个桶分片对象与所需列举对象的列举标识进行比对,判断是否可完整取出所需列举对象,不能完整取出时需作相应处理。

具体地,客户端的列举请求中包含列举标识,所需列举对象为该列举标识之后的N个对象(即将该列举标识之后的N个对象有序取出);列举标识为对象名称。需要说明的是,对象名称为字符串,每个桶分片中以字符串排序将对象进行有序排列。

相应地,步骤S103中若缓存map中包含所需列举对象对应桶的缓存时,从对应桶的缓存中有序列举N个对象前,包括以下步骤:

步骤一,将列举请求中包含的列举标识与桶缓存的每个桶分片的头尾对象进行比较;

步骤二,若对于某个桶分片,列举标识不满足大于等于该桶分片的第一个对象,且小于等于该桶分片的最后一个对象,则从底层相应桶分片中重新获取N个对象存入该缓存的桶分片;其中第一个对象为头对象,最后一个对象为尾对象;

步骤三,若重新存入该桶分片的对象仍不满足列举标识大于等于第一个对象,且小于等于最后一个对象,则继续从底层相应桶分片中重新获取N个对象存入该缓存的桶分片,直至该桶分片的对象满足列举标识大于等于第一个对象,且小于等于最后一个对象。

上述步骤二和步骤三中从底层相应桶分片中重新获取的N个对象是上次从该桶分片取出的多个对象中最后一个对象之后的N个对象。比如底层某个桶分片中包含对象n1、n2、n3、n4和n5,上次取走了n1和n2,若这次需要取2个对象,则应取走n3和n4。

经上述处理,缓存map中对应桶的各个桶分片均包含需要取出的对象,可保证完整有序列举所需对象。

之后便可从桶缓存中有序列举N个对象,本实施例上述步骤S103中,从对应桶的缓存中有序列举N个对象,具体包括以下步骤:

步骤一,根据列举请求中的列举标识,从每个桶分片中取出该列表标识之后第一个对象,共取出M个对象,从该M个对象中取出最大的对象为第一个列举对象;

步骤二,将第一列举对象的名称作为新的列举标识,从每个桶分片中取出该新的列表标识之后第一个对象,共取出M个对象,从该M个对象中取出最大的对象为第二个列举对象;

步骤三,以此类推,直到取出N个列举对象。

经上述步骤,可从桶缓存中有序列举N个对象。

本实施例中,将每次从缓存map中有序列举的N个对象从缓存map中删除,减少内存占用。相应地,缓存map中桶分片内的对象会逐渐用完,为保证后续可继续从缓存map中取对象,及时为缓存的桶分片补充缓存对象。具体实施时,可由以下几种方法实现桶分片缓存对象的补充:

方法一,若缓存map中某个桶分片的对象使用完时,从底层相应桶分片中重新获取N个对象存入该缓存的桶分片;

方法二,实时检测缓存map中各个桶分片剩余对象的个数H,若某个桶分片剩余对象的个数H小于等于阈值,则从底层相应桶分片中重新获取N个对象存储该缓存的桶分片;

方法三,实时检测缓存map中各个桶分片剩余对象的个数H,若某个桶分片剩余对象的个数H小于等于阈值,则从底层相应桶分片中重新获取N-H个对象存储该缓存的桶分片。

用户可根据需要自行选择合适的方法。需要说明的是,从底层相应桶分片中重新获取的N个对象或N-H个对象为上次获取的所有对象中最后一个对象之后的N个对象或N-H个对象。

实施例二

本实施例二提供一种对象存储有序列举装置,用于实现前述的存储有序列举方法。同样,每次列举N个对象,每个桶有M个桶分片,N和M均为大于等于1的整数。

如图2所示为本实施例二提供的一种对象存储有序列举装置结构示意框图,包括以下功能模块。

桶缓存检测模块:接收到客户端的列举请求时,检测缓存map中是否包含所需列举对象对应桶的缓存;

底层列举模块:若不包含,则从底层相应桶的M个桶分片中读取M*N个对象,每个桶分片读取N个对象,从该M*N个对象中有序列举N个对象发送至客户端,并将剩余(M-1)*N个对象存至缓存map中;该剩余(M-1)*N个对象为该桶在缓存map中的缓存;

缓存列举模块:若包含,则从对应桶的缓存中有序列举N个对象发送至客户端。

本实施例的对象存储有序列举装置用于实现前述的对象存储有序列举法,因此该装置中的具体实施方式可见前文中的对象存储有序列举方法的实施例部分,所以,其具体实施方式可以参照相应的各个部分实施例的描述,在此不再展开介绍。

另外,由于本实施例的对象存储有序列举装置用于实现前述的对象存储有序列举方法,因此其作用与上述方法的作用相对应,这里不再赘述。

实施例三

图3为本发明实施例提供的一种终端装置300的结构示意图,该终端装置300可以用于执行本发明实施例提供的对象存储有序列举方法。

其中,该终端装置300可以包括:处理器310、存储器320及通信单元330。这些组件通过一条或多条总线进行通信,本领域技术人员可以理解,图中示出的服务器的结构并不构成对本发明的限定,它既可以是总线形结构,也可以是星型结构,还可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。

其中,该存储器320可以用于存储处理器310的执行指令,存储器320可以由任何类型的易失性或非易失性存储终端或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。当存储器320中的执行指令由处理器310执行时,使得终端300能够执行以下上述方法实施例中的部分或全部步骤。

处理器310为存储终端的控制中心,利用各种接口和线路连接整个电子终端的各个部分,通过运行或执行存储在存储器320内的软件程序和/或模块,以及调用存储在存储器内的数据,以执行电子终端的各种功能和/或处理数据。所述处理器可以由集成电路(Integrated Circuit,简称IC) 组成,例如可以由单颗封装的IC 所组成,也可以由连接多颗相同功能或不同功能的封装IC而组成。举例来说,处理器310可以仅包括中央处理器(Central Processing Unit,简称CPU)。在本发明实施方式中,CPU可以是单运算核心,也可以包括多运算核心。

通信单元330,用于建立通信信道,从而使所述存储终端可以与其它终端进行通信。接收其他终端发送的用户数据或者向其他终端发送用户数据。

实施例四

本发明还提供一种计算机存储介质,其中,该计算机存储介质可存储有程序,该程序执行时可包括本发明提供的各实施例中的部分或全部步骤。所述的存储介质可为磁碟、光盘、只读存储记忆体(英文:read-only memory,简称:ROM)或随机存储记忆体(英文:random access memory,简称:RAM)等。

本领域的技术人员可以清楚地了解到本发明实施例中的技术可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本发明实施例中的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中如U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质,包括若干指令用以使得一台计算机终端(可以是个人计算机,服务器,或者第二终端、网络终端等)执行本发明各个实施例所述方法的全部或部分步骤。

本说明书中各个实施例之间相同相似的部分互相参见即可。尤其,对于终端实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例中的说明即可。

在本发明所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。

以上公开的仅为本发明的优选实施方式,但本发明并非局限于此,任何本领域的技术人员能思之的没有创造性的变化,以及在不脱离本发明原理前提下所作的若干改进和润饰,都应落在本发明的保护范围内。

技术分类

06120113792906