一种基于磁盘的对象缓存方法

文档序号:6524708阅读:169来源:国知局
一种基于磁盘的对象缓存方法
【专利摘要】本发明涉及磁盘缓存【技术领域】,具体涉及一种基于磁盘的对象缓存方法。本发明的一种,包括:划分文件存储空间,构建二级索引的文件存储结构,并依据二级索引的文件存储结构实现该往磁盘缓存中添加对象过程、从磁盘缓存中获取缓存对象过程、从磁盘缓存中删除缓存对象过程、缓存失效机制和缓存优化整理过程,本发明通过本发明通过固定大小的文件块来存储对象的数据,将多个小对象合并存储在一个文件块中,将大对象分拆成多个对象分块(ObjectBlock)分别存储在多个文件块(Chunk)中,能够实现任意大小和任意类型的对象的缓存,缓存效率更高。
【专利说明】一种基于磁盘的对象缓存方法
【技术领域】
[0001]本发明涉及磁盘缓存【技术领域】,具体涉及一种基于磁盘的对象缓存方法。
【背景技术】
[0002]在现代软件开发的过程中,缓存的使用对系统性能的提升起到相当关键的作用。在通常情况下,使用的最多的是内存缓存,即将缓存对象存储到内存中,便于快速的读取。但是,内存缓存的存储空间有限,即使是分布式内存缓存,能够提供的内存存储空间也是有限的,当需要缓存大量的大对象(如图片、音频、视频以及其他大对象等)时,内存缓存就显得不太合适,而基于磁盘的缓存能够很好的满足大对象的存储需求。在基于磁盘的缓存实现中,如果是直接将每个待缓存的对象作为单独文件存储在磁盘中,如果缓存对象数量众多,就会在磁盘中产生大量的问题,这样会大大降低磁盘的读写效率。而缓存对象通常都有一定的生命周期,会根据不同的策略失效,此时,磁盘文件就会频繁的增加和删除,导致大量磁盘碎片产生,从而进一步降低磁盘读写效率。

【发明内容】

[0003]解决上述技术问题,本发明提供了本发明提供了一种基于磁盘的对象缓存方法,能够实现任意大小的对象缓存(如图片、音频、视频以及其他任意对象),通过优化的数据存储结构来实现对象的快速写入和存取,同时,还能够解决大量文件的频繁存取所导致的磁盘碎片问题,从而实现磁盘的空间的高效利用。
[0004]为了达到上述目的,本发明所采用的技术方案是,一种基于磁盘的对象缓存方法,包括:划分文件存储空间,构建二级索引的文件存储结构,该文件存储结构由一个一级索引
文件1.1dx、一个二级索引文件2.1dx、以及一至多个文件块N1.dat (i=l, 2,3,......η, η为
正整数)组成,每一文件块N1.dat划分为一至多个数据槽Si (i=l,2,3,……n,n为正整数),该每一数据槽Si的大小为2n KB,其中η为正整数,且该数据槽Si大小<文件块N1.dat大小,所述一级索引文件1.1dx用于存放一级索引项,一个二级索引文件2.1dx用于存放二级索引项;每一个数据槽在二级索引文件中存在一个二级索引项与之对应,该二级索引项记录该数据槽在哪一个文件块中,以及在文件块中的位置、大小、使用情况等信息。
[0005]往磁盘缓存中添加对象过程:根据对象的主键K设置一级索引项的对象主键ObjKey,根据文件块的设定容量将对象进行分割,形成一个或多个对象分块,每一对象分块大小<文件块大小,将一个或多个对象分块存储到一至多个文件块的数据槽Si中,所述一级索引项记录第一个对象分块所在的数据槽SI的二级索引项在二级索引文件的位置,该数据槽SI对应的二级索引项又记录下一个对象分块所在的数据槽S2的二级索引项在二级索引文件的位置,依次类推,数据槽Si对应的二级索引项又记录下一个对象分块所在的数据槽Si+Ι的二级索引项在二级索引文件2.1dx的位置;
从磁盘缓存中获取缓存对象过程:扫描一级索引文件1.1dx,查找到对象主键ObjKey与对象主键K 一致的一级索引项,该一级索引项记录了该对象的第一个对象分块所在的数据槽SI的二级索引项在二级索引文件2.1dx的位置,从二级索引文件中获取第一个对象分块所在的数据槽SI的二级索引项,通过该二级索引项定位到数据槽SI所在的文件块中获取第一个对象分块的数据,然后依据数据槽SI的二级索引项中记录的第二个对象分块所在的数据槽S2的二级索引项的位置,从二级索引文件2.1dx中获取第二个对象分块所在的数据槽S2的二级索引项,再通过该二级索引项定位到数据槽S2所在的文件块中获取第二个对象分块的数据,依次类推,得到所有对象分块数据,将所有对象分块数据依序排列拼接,得到完整的对象数据;
从磁盘缓存中删除缓存对象过程:扫描一级索引文件1.1dx,查找到对象主键ObjKey与对象主键K 一致的一级索引项,从二级索引文件2.1dx中获取到该对象的第一个对象分块所在的数据槽SI的二级索引项,在该二级索引项中将数据槽SI标记为未使用,再通过该二级索引项获取第二个对象分块所在的数据槽S2的二级索引项,在该二级索引项中将数据槽S2标记为未使用,依次类推,在二级索引文件中标记删除所有对象分块。最后,在将该该对象对应的一级索引项标记为无效,实现该对象在缓存的删除。
[0006]进一步的,每一文件块N1.dat (i=l, 2, 3,......η, η为正整数)的大小相同。
[0007]更进一步的,每一文件块N1.dat (i=l, 2,3,......η, η为正整数)的大小可以为任
意值,推荐为64ΜΒ。
[0008]进一步的,所述一级索引项的长度是34字节,所述一级索引项记录一个缓存对象信息,一级索引项的字段包括:
1)对象主键(ObjKey,20字节):该字段用于存储缓存对象的主键K,每个缓存对象都是通过主键来进行唯一标识;
2)对象创建时间(CreateTime,4字节):该字段用于记录对象添加到缓存中的时间,该字段主要用于对象缓存失效的判断;
3)对象最后访问时间(LastAccessTime,4字节):该字段用于记录对象最后一次被访问的时间,该字段主要用于对象缓存失效的判断;
4)有效性标识(ValidFlag,I字节):该字段用于标记对象在缓存中是否已经失效,O表不失效,I表不有效;当对象被缓存失效机制判定为无效而从缓存中剔除时,缓存系统并不是将该对象对应的一级索引项删除,而是将该对象对应的一级索引项中的ValidFlag字段标记为0,从而实现对象的标记删除;
5)检验和(Checksum,I字节):该字段用于记录对象数据通过特定校验算法(如采用CRC循环校验算法)计算得到的校验和;当从缓存中读取对象数据时,利用该字段来校验对象数据是否完备,从而判断读取到的对象数据是否与与存储时的对象数据一致;
6)第一个数据槽索引(FirstSlotIndex,4字节):该字段用于记录存储对象的第一个分包的数据槽的二级索引项编号,对于小对象,通常只有一个分包;而对于大对象,可以有一至多个分块;
所述二级索引项的长度是21字节,每个二级索引项存储一个数据槽Si的元信息,二级索引项中的字段组成如下:
I)文件块ID (ChunkID,4字节):该字段表示数据槽所在的文件块ID,用整数表示;每个文件块在文件系统中的名称为“〈ChunkID〉.dat” ;2)数据槽偏移量(Slot0ffset,4字节):该字段表示数据槽起始位置在文件块中的偏移量(字节数);
3)数据槽大小(SlotSize,4字节):该字段表示数据槽的字节数,即数据槽所能容纳的最大数据长度;
4)使用标志(UseFlag,I字节):该字段表示数据槽是否被用于存储对象数据:0表示未被使用;1表示被使用;当缓存对象被删除时,存储该对象数据所占用的数据槽并没有被删除,而是将二级索引中该数据槽对应的二级索引项中的UseFlag标记为O,即将数据槽标记删除实现回收,该数据槽可利用于存储其他的对象数据;
5)数据大小(DataSize,4字节):该字段表示被使用的数据槽中,实际存储的数据的大小;因为数据槽在分配时,其大小为2n KB,将数据槽用于存储对象数据时,通常对象数据不会把数据槽的整个空间都占用,会留有小部分的剩余空间,该剩余空间不能被使用,即所谓的空洞;随着大量文件块中的数据槽不断地回收利用,其中的空洞就会越来越多,必须对缓存优化整理,将其中的空洞减少到最小; 6)下一个数据槽索引(NextSlotIndex,4字节):表示存储下一个对象分块的数据槽的二级索引项编号,如果NextSlotIndex为-1,表示该数据槽存储着对象的最后一个对象分块。
[0009]更进一步的,所述对象包括对象主键K和对象数据V,往磁盘缓存中添加对象具体过程为:
Al:扫描一级索引文件1.1dx,判断是否存在一个一级索引项,该一级索引项中的ObjKey与待添加的对象主键K 一致,且ValidFlag为1,如果存在满足条件的一级索引项,则表明缓存中已经存在一个主键为K的对象,转至步骤A2执行;否则,转至步骤A3执行;
A2:返回失败信息,并告知缓存中已经存在主键为K的对象;
A3:计算待缓存的对象大小,若该对象大小>文件块大小,将该对象拆分成若干个对象分块,每个对象分块大小<文件块大小;若对象大小<文件块大小,则将该对象整个作为一个对象分块,转至步骤A4执行;
A4:扫描二级索引文件2.1dx,判断是否存在一个满足“SlotSize值的3/4≤对象分块大小< SlotSize值”条件的空闲数据槽Si,若是,则将该对象分块存储在该空闲数据槽Si中,并在二级索引文件中修改该数据槽Si对应的二级索引项JfUseFlagSE为I ;DataSize设置为对象分块的大小;如果该对象分块是对象的最后一个分块,则将NextSlotIndex设置为_1,如果该对象分块不是对象的第一个分块,则将存储前一个对象分块的数据槽S1-1的二级索引项的NextSlotIndex修改为当前数据槽Si的二级索引项,转至步骤A7执行;否则,若不存在满足“SlotSize值的3/4 <对象分块大小SSlotSize值”条件的空闲数据槽Si,转至步骤A5执行;
A5:遍历文件块N1.dat,判断是否存在一个文件块,该文件块存在空闲空间,且该空闲空间大小必须大于容得下该对象分块的数据槽Si大小,该数据槽Si大小为2n KB,且该数据槽Si大小>该对象分块大小,η计算公式为:[log2 (对象分块大小)]值向上取整数,否贝U,则新增一个文件块(Ni+1).dat,在文件块(Ni+1).dat中创建新数据槽Si,该数据槽Si大小为2n KB,且该数据槽Si+Ι大小>该对象分块大小,η计算公式为:[log2 (对象分块大小)]值向上取整数;A6:将该对象分块存储到该数据槽Si中,并在二级索引文件2.1dx末尾添加该数据槽Si对应的二级索引项:设置ChunkID、SlotOffSet和SlotSize为新数据槽在文件块中的位置和大小^fUseFlag标记为I ;DataSize设置为数据槽中存储的对象分块的大小;如果该对象分块是最后对象的一个分块,则将NextSlotIndex设置为-1,转至步骤A7执行。[0010]A7:对象的所有对象分块都存储到数据槽后,在一级索引文件1.1dx末尾添加一个一级索引项:将ObjKey设置为该对象主键;将CreateTime和LastAccessTime设置为当前时间^fValidFlag设置为I ;将CheckSum设置为从该对象数据计算得到的校验和;将FirstSlotIndex设置为存储第一个对象分包的数据槽SI的二级索引项,返回对象添加成功应答。
[0011]进一步的,从磁盘缓存中获取缓存对象具体方法如下:
B1:利用一级索引扫描一级索引文件1.1dx,查询到一级索引的ObjKey字段等于对象主键K,且ValidFlag字段等于I时,则读取FirstSlotIndex字段,得到存储第一个对象分块的数据槽SI的二级索引项,转至B2执行,否则返回失败应答,
B2:将该二级索引项的编号乘以二级索引项数据长度得到该二级索引项在二级索引文件2.1dx中的偏移位置,通过该偏移位置从二级索引文件2.1dx中读取相应的二级索引项,再根据该二级索引项中的ChunkID、SlotOffset和DataSize字段,从文件块中将对象分块数据读取出来,判断该二级索引项中的NextSlotIndex是否为_1,若是,则表示是最后一个对象分块,转至B3执行;否则,读取NextSlotIndex字段,得到存储下一个对象分块的数据槽的二级索引项的编号,转至B2继续执行;
B3:获取到所有对象分块后,将所有对象分块按照先后顺序拼接起来,得到完整的对象数据,计算读取到的对象数据的校验和,如果该对象数据的校验和等于对应的一级索引项中的CheckSum值,则表明该对象数据完备,修改该一级索引项的LastAccessTime为当前时间,然后成功返回该对象数据;如果对象数据校验失败,则在缓存中删除该对象,并返回获取缓存对象失败应答。
[0012]进一步的,从磁盘缓存中删除缓存对象具体方法如下,输入待删除的对象主键K: Cl:利用一级索引扫描一级索引文件1.1dx,查询到一级索引的ObjKey字段等于对象
主键K,且ValidFlag字段等于I时,则读取FirstSlotIndex字段,得到存储第一个对象分块的数据槽的二级索引项编号,转至C2执行,否则返回失败应答,
C2:将该二级索引项的编号乘以二级索引项数据长度得到该二级索引项在二级索引文件中的偏移位置,通过该偏移位置从二级索引文件中读取相应的二级索引项,将该二级索引项的UseFlag设置为0,标记删除对应的数据槽,回收再利用,判断该二级索引项中的NextSlotIndex是否为_1,若是,则表示是最后一个对象分块,转至C3执行;否则,读取NextSlotIndex字段,得到存储下一个对象分块的数据槽对应的二级索引项的编号,转至C2继续执行;
C3:将对象主键K对应的一级索引项的ValidFlag标记为0,最后返回缓存对象删除成功应答。
[0013]进一步的,本发明还包括过程D:磁盘缓存中缓存的对象通过缓存失效机制来剔除过期的对象,释放磁盘空间,所述缓存失效机制包括两种:LRU(Least Recently Used,最近最少使用)机制和FIFO (First In First Out,先入先出)机制。[0014]更进一步的,通过事先设置的最大缓存时间(MaxCacheTime)参数,两种缓存失效机制工作过程如下:
Dl:LRU机制。定时扫描一级索引文件,对于每一个一级索引项,如果当前时间减去LastAccessTime的值超过MaxCacheTime参数值,贝U认为该一级索引项对应的缓存对象已经过期,则从缓存中删除该对象(参考过程C中描述的步骤进行)。
[0015]D2:FIF0机制。定时扫描一级索引文件,对于每一个一级索引项,如果当前时间减去CreateTime的值超过MaxCacheTime参数值,贝U认为该一级索引项对应的缓存对象已经过期,则从缓存中删除该对象(参考过程C中描述的步骤进行)。
[0016]进一步的,本发明还包括过程E:缓存优化整理过程,包括以下步骤:
El:扫描二级索引文件,得到一个二级索引项列表,该列表中二级索引项按照DataSize值从小到大排列。
[0017]E2:逐个遍历二级索引项列表中的每个二级索引项,从旧文件块中读取二级索引项中指定的旧的数据槽中的数据;
步骤E 3,将旧数据槽中的数据拷贝到新文件块中,然后,修改该二级索引项中的ChunkID、SlotOffset和SlotSize字段指向新文件块的数据槽,如果旧文件块中的数据槽数据都已经搬移到新文件块中,则可以将旧文件块删除。
[0018]进一步的,上述步骤E3:将旧数据槽中的数据拷贝到新文件块中,具体包括如下步骤:
E31:首先根据待搬移的数据大小,计算新数据槽大小,新数据槽大小为2n KB且刚好能够容纳待搬移的数据;
E32:然后在新文件块中创建新的数据槽,然后将数据从旧数据槽中复制到新数据槽中。
[0019]本发明通过本发明通过固定大小的文件块来存储对象的数据,将多个小对象合并存储在一个文件块中,将大对象分拆成多个对象分块(Object Block)分别存储在多个文件块(Chunk)中,每个文件块大小可以设置为任意值,但是经过经验测试,每个文件块大小设置为64MB时磁盘能够更加充分利用,读写效率更高。本发明采用上述技术方案,与现有技术相比,具有如下优点:
1)能够实现任意大小和任意类型的对象的缓存,在实际应用中,可用于图片、音频、视频、其它静态文件以及运行时对象的缓存;
2)将大量小对象合并存储在固定大小的文件块中,能够避免缓存小对象时产生的大量磁盘碎片,导致访问效率低下的问题。
[0020]3)通过设计独特的二级索引方法,能够有效提高缓存对象的存取效率。
[0021]4)通过缓存失效机制和缓存优化整理机制,将文件块中的空洞消除,能够实现高效的空间回收利用。
【专利附图】

【附图说明】
[0022]图1是本发明的实施例的数据存储结构;
图2是本发明的实施例的二级索引字段定义;
图3是本发明的实施例的一级索引字段定义。【具体实施方式】
[0023]现结合附图和【具体实施方式】对本发明进一步说明。
[0024]作为一个具体的实施例,本发明采用基于二级索引的文件存储结构,如图1至图3所示,一种基于磁盘的对象缓存方法,包括:
划分文件存储空间,构建二级索引的文件存储结构,该文件存储结构由一个一级索引
文件1.1dx、一个二级索引文件2.1dx、以及一至多个文件块N1.dat (i=l, 2,3,......η, η为
正整数)组成,每一文件块N1.dat划分为一至多个数据槽Si (i=l,2,3,……n,n为正整数),该每一数据槽Si的大小为2n KB,其中η为正整数,且该数据槽Si大小<文件块N1.dat大小,所述一级索引文件1.1dx用于存放一级索引项,一个二级索引文件2.1dx用于存放二级索引项;每一个数据槽在二级索引文件中存在一个二级索引项与之对应,该二级索引项记录该数据槽在哪一个文件块中,以及数据槽在文件块中的位置、大小、使用情况等信息。
[0025]每一文件块N1.dat (i=l, 2,3,……η,η为正整数)的大小相同且可以设置为任意值。但是经过经验测试,每一文件块N1.dat (i=l,2,3,……η,η为正整数)的大小设置为为64ΜΒ时,磁盘能够更加充分利用,读写效率更高。
[0026]参考图3所示,所述一级索引项的长度是34字节,所述一级索引项记录一个缓存对象信息,一级索引项的字段包括:
1)对象主键(ObjKey,20字节):该字段用于存储缓存对象的主键K,每个缓存对象都是通过主键来进行唯一标识;
2)对象创建时间(CreateTime,4字节):该字段用于记录对象添加到缓存中的时间,该字段主要用于对象缓存失效的判断;
3)对象最后访问时间(LastAccessTime,4字节):该字段用于记录对象最后一次被访问的时间,该字段主要用于对象缓存失效的判断;
4)有效性标识(ValidFlag,I字节):该字段用于标记对象在缓存中是否已经失效,O表不失效,I表不有效;当对象被缓存失效机制判定为无效而从缓存中剔除时,缓存系统并不是将该对象对应的一级索引项删除,而是将该对象对应的一级索引项中的ValidFlag字段标记为0,从而实现对象的标记删除;
5)检验和(Checksum,I字节):该字段用于记录对象数据通过特定校验算法(如采用CRC循环校验算法)计算得到的校验和;当从缓存中读取对象数据时,利用该字段来校验对象数据是否完备,从而判断读取到的对象数据是否与与存储时的对象数据一致;
6)第一个数据槽索引(FirstSlotIndex,4字节):该字段用于记录存储对象的第一个分包的数据槽的二级索引项编号,对于小对象,通常只有一个分包;而对于大对象,可以有一至多个分块;
参考图2所示,所述二级索引项的长度是21字节,每个二级索引项存储一个数据槽Si的元信息,二级索引项中的字段组成如下:
O文件块ID (ChunkID,4字节):该字段表示数据槽所在的文件块ID,用整数表示;每个文件块在文件系统中的名称为“〈ChunkID〉.dat” ;
2)数据槽偏移量(Slot0ffset,4字节):该字段表示数据槽起始位置在文件块中的偏移量(字节数);3)数据槽大小(SlotSize,4字节):该字段表示数据槽的字节数,即数据槽所能容纳的最大数据长度;
4)使用标志(UseFlag,I字节):该字段表示数据槽是否被用于存储对象数据:0表示未被使用;1表示被使用;当缓存对象被删除时,存储该对象数据所占用的数据槽并没有被删除,而是将二级索引中该数据槽对应的二级索引项中的UseFlag标记为0,即将数据槽标记删除实现回收,该数据槽可利用于存储其他的对象数据;
5)数据大小(DataSize,4字节):该字段表示被使用的数据槽中,实际存储的数据的大小;因为数据槽在分配时,其大小为2n KB,将数据槽用于存储对象数据时,通常对象数据不会把数据槽的整个空间都占用,会留有小部分的剩余空间,该剩余空间不能被使用,即所谓的空洞;随着大量文件块中的数据槽不断地回收利用,其中的空洞就会越来越多,必须对缓存优化整理,将其中的空洞减少到最小;
6)下一个数据槽索引(NextSlotIndex,4字节):表示存储下一个对象分块的数据槽的二级索引项编号,如果NextSlotIndex为-1,表示该数据槽存储着对象的最后一个对象分块。
[0027]往磁盘缓存中添加对象过程:根据对象的主键K设置一级索引项的对象主键ObjKey,根据文件块的设定容量将对象进行分割,形成一个或多个对象分块,每一对象分块大小<文件块大小,将一个或多个对象分块存储到一至多个文件块的数据槽Si中,所述一级索引项记录了第一个对象分块所在的数据槽SI的二级索引项在二级索引文件的位置,而数据槽SI对应的二级索引项又记录了下一个对象分块所在的数据槽S2的二级索引项在二级索引文件的位置,依次类推;数据槽Si对应的二级索引项又记录下一个对象分块所在的数据槽Si+Ι的二级索引项在二级索引文件2.1dx的位置;
本实施例中,所述对象包括对象主键K和对象数据V,往磁盘缓存中添加对象具体过程
为:
Al:扫描一级索引文件1.1dx,判断是否存在一个一级索引项,该一级索引项中的ObjKey与待添加的对象主键K 一致,且ValidFlag为1,如果存在满足条件的一级索引项,则表明缓存中已经存在一个主键为K的对象,转至步骤A2执行;否则,转至步骤A3执行;
A2:返回失败信息,并告知缓存中已经存在主键为K的对象;
A3:计算待缓存的对象大小,若该对象大小>文件块大小,将该对象拆分成若干个对象分块,每个对象分块大小<文件块大小;若对象大小<文件块大小,则将该对象整个作为一个对象分块,转至步骤A4执行;
A4:扫描二级索引文件2.1dx,判断是否存在一个满足“SlotSize值的3/4≤对象分块大小< SlotSize值”条件的空闲数据槽Si,若是,则将该对象分块存储在该空闲数据槽Si中,并在二级索引文件中修改该数据槽Si对应的二级索引项:将UseFlag标记为I ;DataSize设置为对象分块的大小;如果该对象分块是对象的最后一个分块,则将NextSlotIndex设置为_1,如果该对象分块不是对象的第一个分块,则将存储前一个对象分块的数据槽S1-1的二级索引项的NextSlotIndex修改为当前数据槽Si的二级索引项,转至步骤A7执行;否则,若不存在满足“SlotSize值的3/4 <对象分块大小SSlotSize值”条件的空闲数据槽Si,转至步骤A5执行;
A5:遍历文件块N1.dat,判断是否存在一个文件块,该文件块存在空闲空间,且该空闲空间大小必须大于容得下该对象分块的数据槽Si大小,该数据槽Si大小为2n KB,且该数据槽Si大小>该对象分块大小,η计算公式为:[log2 (对象分块大小)]值向上取整数,并将剩下的空闲空间记录起来供后续创建数据槽使用,否则,则新增一个文件块(Ni+1).dat,在文件块(Ni+1).dat中创建新数据槽Si,该数据槽Si大小为2n KB,且该数据槽Si+Ι大小>该对象分块大小,η计算公式为:[log2 (对象分块大小)]值向上取整数,并将剩下的空闲空间记录起来供后续创建数据槽使用;
A6:将该对象分块存储到该数据槽Si中,并在二级索引文件2.1dx末尾添加该数据槽Si对应的二级索引项:设置ChunkID、SlotOffset和SlotSize为新数据槽在文件块中的位置和大小^fUseFlag标记为I ;DataSize设置为数据槽中存储的对象分块的大小;如果该对象分块是最后对象的一个分块,则将NextSlotIndex设置为-1,转至步骤A7执行。
[0028]A7:对象的所有对象分块都存储到数据槽后,在一级索引文件1.1dx末尾添加一个一级索引项:将ObjKey设置为该对象主键;将CreateTime和LastAccessTime设置为当前时间^fValidFlag设置为I ;将CheckSum设置为从该对象数据计算得到的校验和;将FirstSlotIndex设置为存储第一个对象分包的数据槽SI的二级索引项,返回对象添加成功应答。
[0029]从磁盘缓存中获取缓存对象过程:扫描一级索引文件1.1dx,查找到对象主键ObjKey与对象主键K 一致的一级索引项,该一级索引项记录了该对象的第一个对象分块所在的数据槽SI的二级索引项在二级索引文件2.1dx的位置,从二级索引文件中获取第一个对象分块所在的数据槽SI的二级索引项,通过该二级索引项定位到数据槽SI所在的文件块中获取第一个对象分块的数据,然后依据数据槽SI的二级索引项中记录的第二个对象分块所在的数据槽S2的二级索引项的位置,从二级索引文件2.1dx中获取第二个对象分块所在的数据槽S2的二级索引项,再通过该二级索引项定位到数据槽S2所在的文件块中获取第二个对象分块的数据 ,依次类推,得到所有对象分块数据,将所有对象分块数据依序排列拼接,得到完整的对象数据;
本实施例中,从磁盘缓存中获取缓存对象具体方法如下:
B1:利用一级索引扫描一级索引文件1.1dx,查询到一级索引的ObjKey字段等于对象主键K,且ValidFlag字段等于I时,则读取FirstSlotIndex字段,得到存储第一个对象分块的数据槽SI的二级索引项,转至B2执行,否则返回失败应答,
B2:将该二级索引项的编号乘以二级索引项数据长度得到该二级索引项在二级索引文件2.1dx中的偏移位置,通过该偏移位置从二级索引文件2.1dx中读取相应的二级索引项,再根据该二级索引项中的ChunkID、SlotOffset和DataSize字段,从文件块中将对象分块数据读取出来,判断该二级索引项中的NextSlotIndex是否为_1,若是,则表示是最后一个对象分块,转至B3执行;否则,读取NextSlotIndex字段,得到存储下一个对象分块的数据槽的二级索引项的编号,转至B2继续执行;
B3:获取到所有对象分块后,将所有对象分块按照先后顺序拼接起来,得到完整的对象数据,计算读取到的对象数据的校验和,如果该对象数据的校验和等于对应的一级索引项中的CheckSum值,则表明该对象数据完备,修改该一级索引项的LastAccessTime为当前时间,然后成功返回该对象数据;如果对象数据校验失败,则在缓存中删除该对象,并返回获取缓存对象失败应答。[0030]从磁盘缓存中删除缓存对象过程:扫描一级索引文件1.1dx,查找到对象主键ObjKey与对象主键K 一致的一级索引项,从二级索引文件2.1dx中获取到该对象的第一个对象分块所在的数据槽SI的二级索引项,在该二级索引项中将数据槽SI标记为未使用,再通过该二级索引项获取第二个对象分块所在的数据槽S2的二级索引项,在该二级索引项中将数据槽S2标记为未使用,依次类推,在二级索引文件中标记删除所有对象分块。最后,在将该该对象对应的一级索引项标记为无效,实现该对象在缓存的删除。
[0031]本实施例中,从磁盘缓存中删除缓存对象具体方法如下,输入待删除的对象主键K,:
Cl:利用一级索引扫描一级索引文件1.1dx,查询到一级索引的ObjKey字段等于对象主键K,且ValidFlag字段等于I时,则读取FirstSlotIndex字段,得到存储第一个对象分块的数据槽的二级索引项编号,转至C2执行,否则返回失败应答,
C2:将该二级索引项的编号乘以二级索引项数据长度得到该二级索引项在二级索引文件中的偏移位置,通过该偏移位置从二级索引文件中读取相应的二级索引项,将该二级索引项的UseFlag设置为0,标记删除对应的数据槽,回收再利用,判断该二级索引项中的NextSlotIndex是否为-1,若是,则表示是最后一个对象分块,转至C3执行;否则,读取NextSlotIndex字段,得到存储下一个对象分块的数据槽对应的二级索引项的编号,转至C2继续执行;
C3:将对象主键K对应的一级索引项的ValidFlag标记为0,最后返回缓存对象删除成功应答。
[0032]本实施例还包括过程D:磁盘缓存中缓存的对象通过缓存失效机制来剔除过期的对象,释放磁盘空间,所述缓存失效机制包括两种:LRU(Least Recently Used,最近最少使用)机制和FIFO (First In First Out,先入先出)机制。
[0033]通过事先设置的最大缓存时间(MaxCacheTime)参数,两种缓存失效机制工作过程如下:
Dl:LRU机制。定时扫描一级索引文件,对于每一个一级索引项,如果当前时间减去LastAccessTime的值超过MaxCacheTime参数值,贝U认为该一级索引项对应的缓存对象已经过期,则从缓存中删除该对象(参考过程C中描述的步骤进行)。
[0034]D2:FIF0机制。定时扫描一级索引文件,对于每一个一级索引项,如果当前时间减去CreateTime的值超过MaxCacheTime参数值,贝U认为该一级索引项对应的缓存对象已经过期,则从缓存中删除该对象(参考过程C中描述的步骤进行)。
[0035]本实施例还包括过程E:缓存优化整理过程,包括以下步骤:经过一段时间使用后,文件块中数据槽就会出现很多空洞,为了使磁盘空间实现充分利用,以及维持对象的高效存取速度,需要定期对缓存进行优化整理,减少文件块中的空洞。缓存优化整理过程如下:
El:扫描二级索引文件,得到一个二级索引项列表,该列表中二级索引项按照DataSize值从小到大排列。
[0036]E2:逐个遍历二级索引项列表中的每个二级索引项,从旧文件块中读取二级索引项中指定的旧的数据槽中的数据;
步骤E 3,将旧数据槽中的数据拷贝到新文件块中,然后,修改该二级索引项中的ChunkID, SlotOffset和SlotSize字段指向新文件块的数据槽,如果旧文件块中的数据槽数据都已经搬移到新文件块中,则可以将旧文件块删除。
[0037]进一步的,上述步骤E3:将旧数据槽中的数据拷贝到新文件块中,具体包括如下步骤:
E31:首先根据待搬移的数据大小,计算新数据槽大小,新数据槽大小为2n KB且刚好能够容纳待搬移的数据;
E32:然后在新文件块中创建新的数据槽,然后将数据从旧数据槽中复制到新数据槽中。
[0038]尽管结合优选实施方案具体展示和介绍了本发明,但所属领域的技术人员应该明白,在不脱离所附权利要求书所限定的本发明的精神和范围内,在形式上和细节上可以对本发明做出各种变化,均为本发明的保护范围。
【权利要求】
1.一种基于磁盘的对象缓存方法,其特征在于,包括: 划分文件存储空间,构建二级索引的文件存储结构,该文件存储结构由一个一级索引文件1.1dx、一个二级索引文件2.1dx、以及一至多个文件块N1.dat (i=l, 2,3,......η, η为正整数)组成,每一文件块N1.dat划分为一至多个数据槽Si (i=l,2,3,……n,n为正整数),该每一数据槽Si的大小为2n KB,其中η为正整数,且该数据槽Si大小<文件块N1.dat大小,所述一级索引文件1.1dx用于存放一级索引项,一个二级索引文件2.1dx用于存放二级索引项;每一个数据槽Si在二级索引文件2.1dx中存在一个二级索引项与之对应,该二级索引项记录该数据槽Si在哪一个文件块中,以及数据槽Si在文件块中的位置、大小、使用情况等信息, 往磁盘缓存中添加对象过程:根据对象的主键K设置一级索引项的对象主键ObjKey,根据文件块的设定容量将对象进行分割,形成一个或多个对象分块,每一对象分块大小<文件块大小,将一个或多个对象分块存储到一至多个文件块的数据槽Si中,所述一级索引项记录第一个对象分块所在的数据槽SI的二级索引项在二级索引文件2.1dx的位置,该数据槽SI对应的二级索引项又记录下一个对象分块所在的数据槽S2的二级索引项在二级索引文件2.1dx2.1dx的位置,依次类推,数据槽Si对应的二级索引项又记录第i+Ι个对象分块所在的数据槽Si+Ι的二级索引项在二级索引文件2.1dx的位置; 从磁盘缓存中获取缓存对象过程:扫描一级索引文件1.1dx,查找到对象主键ObjKey与对象主键K 一致的一级索引项,该一级索引项记录了该对象的第一个对象分块所在的数据槽SI的二级索引项在二级索引文件2.1dx的位置,从二级索引文件2.1dx中获取第一个对象分块所在的数据槽SI的二级索引项,通过该二级索引项定位到数据槽SI所在的文件块中获取第一个对象分块的数据,然后依据数据槽SI的二级索引项中记录的第二个对象分块所在的数据槽S`2的二级索引项的位置,从二级索引文件2.1dx中获取第二个对象分块所在的数据槽S2的二级索引项,再通过该二级索引项定位到数据槽S2所在的文件块中获取第二个对象分块的数据,依次类推,得到所有对象分块数据,将所有对象分块数据依序排列拼接,得到完整的对象数据; 从磁盘缓存中删除缓存对象过程:扫描一级索引文件1.1dx,查找到对象主键ObjKey与对象主键K 一致的一级索引项,从二级索引文件2.1dx中获取到该对象的第一个对象分块所在的数据槽SI的二级索引项,在该二级索引项中将数据槽SI标记为未使用,再通过该二级索引项获取第二个对象分块所在的数据槽S2的二级索引项,在该二级索引项中将数据槽S2标记为未使用,依次类推,在二级索引文件2.1dx中标记删除所有对象分块,最后,在将该该对象对应的一级索引项标记为无效,实现该对象在缓存的删除。
2.根据权利要求1所述的一种基于磁盘的对象缓存方法,其特征在于:每一文件块N1.dat (i=l,2,3,……η,η为正整数)的大小相同。
3.根据权利要求1所述的一种基于磁盘的对象缓存方法,其特征在于:所述一级索引项的长度是34字节,所述一级索引项记录一个缓存对象信息,一级索引项的字段包括: 1)对象主键(ObjKey,20字节):该字段用于存储缓存对象的主键K,每个缓存对象都是通过主键来进行唯一标识; 2)对象创建时间(CreateTime,4字节):该字段用于记录对象添加到缓存中的时间,该字段主要用于对象缓存失效的判断;3)对象最后访问时间(LastAccessTime,4字节):该字段用于记录对象最后一次被访问的时间,该字段主要用于对象缓存失效的判断; 4)有效性标识(ValidFlag,I字节):该字段用于标记对象在缓存中是否已经失效,O表示失效,I表示有效; 5)检验和(Checksum,I字节):该字段用于记录对象数据通过特定校验算法(如采用CRC循环校验算法)计算得到的校验和; 6)第一个数据槽索引(FirstSlotIndex,4字节):该字段用于记录存储对象的第一个分包的数据槽的二级索引项编号; 所述二级索引项的长度是21字节,每个二级索引项存储一个数据槽Si的元信息,二级索引项中的字段组成如下: O文件块ID (ChunkID,4字节):该字段表示数据槽所在的文件块ID,用整数表示;每个文件块在文件系统中的名称为“〈ChunkID〉.dat” ; 2)数据槽偏移量(Slot0ffset,4字节):该字段表示数据槽起始位置在文件块中的偏移量(字节数); 3)数据槽大小(SlotSize,4字节):该字段表示数据槽的字节数,即数据槽所能容纳的最大数据长度; 4)使用标志(UseFlag,I字节):该字段表示数据槽是否被用于存储对象数据:0表示未被使用;I表示被使用; 5)数据大小(DataSize,4字节):该字段表示被使用的数据槽中,实际存储的数据的大小; 6)下一个数据槽索引(NextSlotIndex,4字节):用于存储下一个对象分块的数据槽的二级索引项编号,如果NextSlotIndex为-1,表示该数据槽存储着对象的最后一个对象分块。
4.根据权利要求3所述的一种基于磁盘的对象缓存方法,其特征在于: 所述对象包括对象主键K和对象数据V,往磁盘缓存中添加对象具体过程为: Al:扫描一级索引文件1.1dx,判断是否存在一个一级索引项,该一级索引项中的ObjKey与待添加的对象主键K 一致,且ValidFlag为1,如果存在满足条件的一级索引项,则表明缓存中已经存在一个主键为K的对象,转至步骤A2执行;否则,转至步骤A3执行; A2:返回失败信息,并告知缓存中已经存在主键为K的对象; A3:计算待缓存的对象大小,若该对象大小>文件块大小,将该对象拆分成若干个对象分块,每个对象分块大小<文件块大小;若对象大小<文件块大小,则将该对象整个作为一个对象分块,转至步骤A4执行; A4:扫描二级索引文件2.1dx,判断是否存在一个满足“SlotSize值的3/4≤对象分块大小< SlotSize值”条件的空闲数据槽Si,若是,则将该对象分块存储在该空闲数据槽Si中,并在二级索引文件2.1dx中修改该数据槽Si对应的二级索引项JfUseFlag#记为I ;DataSize设置为对象分块的大小;如果该对象分块是对象的最后一个分块,则将NextSlotIndex设置为_1,如果该对象分块不是对象的第一个分块,则将存储前一个对象分块的数据槽S1-1的二级索引项的NextSlotIndex修改为当前数据槽Si的二级索引项,转至步骤A7执行;否则,若不存在满足“SlotSize值的3/4 <对象分块大小SSlotSize值”条件的空闲数据槽Si,转至步骤A5执行; A5:遍历文件块N1.dat,判断是否存在一个文件块,该文件块存在空闲空间,且该空闲空间大小必须大于容得下该对象分块的数据槽Si大小,该数据槽Si大小为2n KB,且该数据槽Si大小>该对象分块大小,η计算公式为:[log2 (对象分块大小)]值向上取整数,否则,则新增一个文件块(Ni+1).dat,在文件块(Ni+1).dat中创建新数据槽Si,该数据槽Si大小为2nKB,且该数据槽Si大小>该对象分块大小,η计算公式为:[log2 (对象分块大小)]值向上取整数, A6:将该对象分块存储到该数据槽Si中,并在二级索引文件2.1dx末尾添加该数据槽Si对应的二级索引项:设置ChunkID、SlotOffSet和SlotSize为新数据槽在文件块中的位置和大小^fUseFlag标记为I ;DataSize设置为数据槽中存储的对象分块的大小;如果该对象分块是最后对象的一个分块,则将NextSlotIndex设置为-1,转至步骤A7执行, A7:对象的所有对象分块都存储到数据槽后,在一级索引文件1.1dx末尾添加一个一级索引项:将ObjKey设置为该对象主键;将CreateTime和LastAccessTime设置为当前时间^fValidFlag设置为I ;将CheckSum设置为从该对象数据计算得到的校验和;将FirstSlotIndex设置为存储第一个对象分包的数据槽SI的二级索引项,返回对象添加成功应答。
5.根据权利要求3所述的一种基于磁盘的对象缓存方法,其特征在于: 从磁盘缓存中获取缓存对象具体方法如下: B1:利用一级索引扫 描一级索引文件1.1dx,查询到一级索引的ObjKey字段等于对象主键K,且ValidFlag字段等于I时,则读取FirstSlotIndex字段,得到存储第一个对象分块的数据槽SI的二级索引项,转至B2执行,否则返回失败应答, B2:将该二级索引项的编号乘以二级索引项数据长度得到该二级索引项在二级索引文件2.1dx中的偏移位置,通过该偏移位置从二级索引文件2.1dx中读取相应的二级索引项,再根据该二级索引项中的ChunkID、SlotOffset和DataSize字段,从文件块中将对象分块数据读取出来,判断该二级索引项中的NextSlotIndex是否为_1,若是,则表示是最后一个对象分块,转至B3执行;否则,读取NextSlotIndex字段,得到存储下一个对象分块的数据槽的二级索引项的编号,转至B2继续执行; B3:获取到所有对象分块后,将所有对象分块按照先后顺序拼接起来,得到完整的对象数据,计算读取到的对象数据的校验和,如果该对象数据的校验和等于对应的一级索引项中的CheckSum值,则表明该对象数据完备,修改该一级索引项的LastAccessTime为当前时间,然后成功返回该对象数据;如果对象数据校验失败,则在缓存中删除该对象,并返回获取缓存对象失败应答。
6.根据权利要求3所述的一种基于磁盘的对象缓存方法,其特征在于: 从磁盘缓存中删除缓存对象具体方法如下,输入待删除的对象主键K, Cl:利用一级索引扫描一级索引文件1.1dx,查询到一级索引的ObjKey字段等于对象主键K,且ValidFlag字段等于I时,则读取FirstSlotIndex字段,得到存储第一个对象分块的数据槽的二级索引项编号,转至C2执行,否则返回失败应答, C2:将该二级索引项的编号乘以二级索引项数据长度得到该二级索引项在二级索引文件2.1dx中的偏移位置,通过该偏移位置从二级索引文件2.1dx中读取相应的二级索引项,将该二级索引项的UseFlag设置为O,标记删除对应的数据槽,回收再利用,判断该二级索引项中的NextSlotIndex是否为-1,若是,则表示是最后一个对象分块,转至C3执行;否贝1J,读取NextSlotIndex字段,得到存储下一个对象分块的数据槽对应的二级索引项的编号,转至C2继续执行; C3:将对象主键K对应的一级索引项的ValidFlag标记为0,最后返回缓存对象删除成功应答。
7.根据权利要求3所述的一种基于磁盘的对象缓存方法,其特征在于:还包括过程D:磁盘缓存中缓存的对象通过缓存失效机制来剔除过期的对象,释放磁盘空间,所述缓存失效机制包括两种:LRU(Least Recently Used,最近最少使用)机制和FIFO(First In FirstOut,先入先出)机制。
8.根据权利要求7所述的一种基于磁盘的对象缓存方法,其特征在于: 通过事先设置的最大缓存时间(MaxCacheTime)参数,两种缓存失效机制工作过程如下: Dl:LRU机制:定时扫描一级索引文件,对于每一个一级索引项,如果当前时间减去LastAccessTime的值超过MaxCacheTime参数值,贝U认为该一级索引项对应的缓存对象已经过期,则从缓存中删除该对象; D2:FIF0机制:定时扫描一级索引文件,对于每一个一级索引项,如果当前时间减去CreateTime的值超过MaxCacheTime参数值,贝U认为该一级索引项对应的缓存对象已经过期,则从缓存中 删除该对象。
9.根据权利要求3所述的一种基于磁盘的对象缓存方法,其特征在于:还包括过程E:缓存优化整理过程,包括以下步骤: El:扫描二级索引文件2.1dx,得到一个二级索引项列表,该列表中二级索引项按照DataSize值从小到大排列; E2:逐个遍历二级索引项列表中的每个二级索引项,从旧文件块中读取二级索引项中指定的旧的数据槽中的数据; 步骤E 3,将旧数据槽中的数据拷贝到新文件块中,然后,修改该二级索引项中的ChunkID、SlotOffset和SlotSize字段指向新文件块的数据槽,如果旧文件块中的数据槽数据都已经搬移到新文件块中,则可以将旧文件块删除。
10.根据权利要求9所述的一种基于磁盘的对象缓存方法,其特征在于:所述步骤E3:将旧数据槽中的数据拷贝到新文件块中,具体包括如下步骤: E31:首先根据待搬移的数据大小,计算新数据槽大小,新数据槽大小为2n KB且刚好能够容纳待搬移的数据; E32:然后在新文件块中创建新的数据槽,然后将数据从旧数据槽中复制到新数据槽中。
【文档编号】G06F17/30GK103678638SQ201310710511
【公开日】2014年3月26日 申请日期:2013年12月20日 优先权日:2013年12月20日
【发明者】程行荣, 刘志芳, 吴超民, 孙震, 黄文淮 申请人:厦门雅迅网络股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1