CN107515901B - 一种链式日志存储结构及其哈希索引结构、数据操作方法及服务器、介质 - Google Patents
一种链式日志存储结构及其哈希索引结构、数据操作方法及服务器、介质 Download PDFInfo
- Publication number
- CN107515901B CN107515901B CN201710606580.2A CN201710606580A CN107515901B CN 107515901 B CN107515901 B CN 107515901B CN 201710606580 A CN201710606580 A CN 201710606580A CN 107515901 B CN107515901 B CN 107515901B
- Authority
- CN
- China
- Prior art keywords
- field
- hash
- value
- data
- bucket
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 39
- 238000013500 data storage Methods 0.000 claims description 13
- 238000004364 calculation method Methods 0.000 claims description 11
- 230000006870 function Effects 0.000 claims description 8
- 238000012217 deletion Methods 0.000 claims description 6
- 230000037430 deletion Effects 0.000 claims description 6
- 238000013508 migration Methods 0.000 claims description 4
- 230000005012 migration Effects 0.000 claims description 4
- 238000013467 fragmentation Methods 0.000 abstract description 5
- 238000006062 fragmentation reaction Methods 0.000 abstract description 5
- 238000001514 detection method Methods 0.000 description 8
- 238000013461 design Methods 0.000 description 4
- 238000003780 insertion Methods 0.000 description 4
- 230000037431 insertion Effects 0.000 description 4
- 238000011056 performance test Methods 0.000 description 4
- 239000012634 fragment Substances 0.000 description 3
- 238000007726 management method Methods 0.000 description 3
- 238000010586 diagram Methods 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 101100481876 Danio rerio pbk gene Proteins 0.000 description 1
- 101100481878 Mus musculus Pbk gene Proteins 0.000 description 1
- 238000004458 analytical method Methods 0.000 description 1
- 230000001934 delay Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000009191 jumping Effects 0.000 description 1
- 230000005055 memory storage Effects 0.000 description 1
- 230000008447 perception Effects 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
- G06F16/24552—Database cache management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
- G06F16/2255—Hash tables
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种链式日志存储结构及其哈希索引结构、数据操作方法及服务器、介质。本发明的链式日志存储结构,包括多个存储段和一数组,每一存储段的存储单元为一日志项,日志项包括初始大小字段、索引位置字段、键长度字段、Key字段和Value字段;其中Value字段用于存储数据,Key字段用于存储数据的键,初始大小字段用于存储日志项的初始大小,索引位置字段用于存储日志项的索引在哈希表中的位置;所述数组用于存储各存储段的元信息。本发明的哈希索引结构包括多个哈希桶,每一哈希桶的数据结构包括:索引数字段、有效标志字段、标签字段、偏移量字段和扩展桶字段。本发明能够保持整个结构内存的紧密连续性,降低碎片率。
Description
技术领域
本发明属于IT技术领域,涉及一种NoSql内存数据库-数据存储结构,特别涉及一种链式日志存储结构及其哈希索引结构、数据操作方法及服务器、介质。
背景技术
网络空间资源测绘是对网络空间资源的统一描述、全面感知和全景刻画。通过对网络空间资源的探测、分析和绘制,对我国建设成为网络强国具有重要意义,然而网络空间资源规模庞大并且动态时变,为此需要一种高效的资源缓存策略,能够对资源进行去重存储和高效查询,支持业务用户全面掌握网络空间资源特性及其分布。
此外,随着互联网的发展,互联网越来越深刻的影响人们的日常生活,有线网、无线网和4G移动网络成为人们日常使用互联网的最常用的接入方式。对于互联网服务提供者来说,为方便用户在不同网络切换时不用重复登录,经常采用的方案是将用户的UUID缓存在服务器端,当用户切换网络时能快速查找到用户的登录状态,并将用户正在查看的信息直接显示在用户当前的终端上。因此需要在服务端部署一个高效的缓存系统,方便缓存大量的用户登录信息,同时保证能高效的查询该信息。
目前的内存缓存系统如Redis和Memcached等都采用哈希表(Hashtable)作为其索引结构。哈希表是根据键(Key)的哈希散列值来直接访问在内存存储位置的数据结构。其核心思想是设关键字为k,则其值存放在f(k)的存储位置上。由此,不需比较便可直接取得所查记录,并称这个对应关系f为散列函数。哈希表的存储单元皆由key和value的键值对组成。
然而由于计算机内存资源的有限,哈希表的大小是有限的,所以散列函数的映射关系只能是多对一的,这就可能出现k1≠k2,f(k1)=f(k2),这种情况称为哈希冲突(Collision),通过构造性能良好的散列函数可以减少冲突,但一般不可能完全避免冲突,因此解决冲突是构建哈希表的一个关键问题。
处理哈希冲突的方法主要可分为四种:
开放地址法:hashi=(hash(key)+di)mod m,i=1,2…k(k≤m-1),其中hash(key)为散列函数,m为散列表长度,di位增量序列,i为已发生冲突的次数。根据增量序列的不同可分为线性探测、平方探测和伪随机探测等。
链地址法:这种方法的基本思想是将发生哈希冲突的元组构成一个单链表,查找、插入和删除都通过遍历这个链表来实现。
再哈希法:hashi=hashi(key),i=1,2…k。hashi是一个哈希族,即在哈希计算发生冲突时,使用下一个哈希族函数计算哈希值,直到冲突不再产生。
公共溢出区法:建立一个公共溢出区,所有发生哈希冲突的元素都存储到该溢出区中。
现有的哈希冲突解决方法都会引入较多额外的开销,降低了哈希表的查找效率。开放地址法采用线性探测时由于增量序列是单调递增的,容易形成聚簇使数据在哈希表中分布不均,采用平方探测或伪随机探测则需要多次的随机访问,降低Cache的效率。链地址法引入了额外的指针开销,而且插入和查找时都需要遍历链表,效率较低。再哈希法需要进行多次哈希计算,计算开销较大。公共溢出区只适用于存储元素较少的场景。此外,目前的动态内存分配方式存在内存碎片问题导致内存利用率不高,这对内存缓存系统资源的开销是不可忽视的。
本发明通过设计一个高效的哈希索引结构,降低发生哈希冲突时大量指针遍历和字符串比对等操作带来的额外开销,同时设计一个内存友好的存储结构以较少内存碎片,提高内存利用率。
发明内容
为了提高内存键值对缓存系统的查询效率,本发明提供了一种链式日志存储结构及其哈希索引结构、数据操作方法及服务器、介质。本发明设计了一种新的哈希索引结构;同时为了更好地配合索引结构的特点并且减少传统动态内存分配器带来的内存碎片问题,本发明提出了使用连续内存段进行数据存储与管理的方案。
本发明通过合理的设计数据布局提高Cache命中率,并通过SIMD指令集加速索引查找的查询方法。使用连续的固定大小内存块来管理和存储数据,避免内存碎片的内存管理方法。
本发明的技术方案为:
一种链式日志存储结构,其特征在于,包括多个存储段Segment和一数组,每一所述存储段Segment的存储单元为一日志项,所述日志项包括初始大小字段、索引位置字段、键长度字段、Key字段和Value字段;其中Value字段用于存储数据,Key字段用于存储数据的键,初始大小字段用于存储日志项的初始大小,索引位置字段用于存储日志项的索引在哈希表中的位置;所述数组用于存储各存储段Segment的元信息。
所述元信息包括存储段Segment的起始地址、首元素地址、前后邻接存储段Segment的元信息在数组中的存放位置,以及存储段Segment的失效数据量。
所述前后邻接存储段Segment的元信息在数组中的存放位置为前后邻接存储段Segment元信息的数组下标。
使用大顶堆统计失效数据量最多的前K个存储段Segment,当内存使用率低于配置阈值时,对大顶堆中失效数据与segment大小的比例最大的存储段Segment进行迁移操作,将该存储段Segment中的有效数据重新插入到链式日志存储结构的头部位置,之后释放空的存储段Segment。
一种链式日志存储结构的哈希索引结构,其特征在于,包括多个哈希桶,每一所述哈希桶的数据结构包括:索引数字段、有效标志字段、标签字段、偏移量字段和扩展桶字段;其中,索引数字段,用于存储哈希桶中的有效索引项数量;有效标志字段是一位向量,该位向量的位数与标签字段中的标签数相同,该位向量中置0的位表示对应的标签值是有效的;标签字段中的标签值是Key字段中键的64位哈希值的前16位,后48位为哈希桶的下标;偏移量字段,用于存储Value字段中数据的存储位置在链式日志存储结构中的相对偏移量,根据Key字段、Value字段中键值对的对应关系标签字段中的标签值与偏移字段中的相对偏移量一一对应;当一哈希桶已满时,新的索引项会被插入到与该哈希桶最近的空哈希桶中,扩展桶字段用于记录该空哈希桶的下标。
所述相对偏移量占用48bit,其中前26bit存储存储段Segment的元信息数组下标,后22bit存储相对存储段Segment首元素地址的偏移量。
一种数据查询方法,其步骤包括:
1)对待查询数据value的关键字key进行哈希散列计算获得64位的哈希值;
2)取该哈希值的前16位为标签值tag,根据该哈希值后48位定位到哈希桶;
3)查找定位到的哈希桶的Tag字段中是否存在该标签值tag,若存在则返回该标签值对应的相对偏移量;如果不存在,且扩展桶字段不为空,则从该扩展桶字段指向的哈希桶中进行查找,直到找到该标签值tag或扩展桶字段为空;
4)根据返回的相对偏移量获取日志项,返回结果。
一种数据存储方法,其步骤包括:
1)对待存储数据value的关键字key进行哈希散列计算获得64位的哈希值;
2)取该哈希值的前16位为标签值tag,根据该哈希值的后48位定位到哈希桶;
3)若该哈希桶未满,则进行步骤4);若该哈希桶已满但扩展桶字段不为空,则选取该扩展桶字段标识的哈希桶,进行步骤4);若该哈希桶已满且扩展桶字段为空,则查找下一个非满哈希桶,把扩展桶字段赋值为该非满哈希桶的下标,然后进行步骤4);
4)在当前哈希桶的有效标志字段的位向量中找到一置1的位,设置标签字段中该位对应的标签值为该哈希值的前16位,偏移字段中对应的相对偏移量前26位设置为该待存储数据value要存入的存储段Segment的元信息数组下标,后22位设置为头部指针与该存储段Segment的首元素地址的差值;
5)更新哈希桶的索引数字段和有效标志字段,即索引数字段的字段值加1,有效标志字段对应的位向量位置置0;
6)向头部指针处插入新的日志项存储该待存储数据value,若当前的存储段Segment剩余空间不足,则申请一个新的存储段Segment映射到当前存储段Segment的邻接位置,并更新存储存储段Segment元信息的数组,新的存储段Segment的首元素地址为当前头部指针的地址。
一种数据更新方法,其步骤包括:判断更新后的日志项是否大于原始的日志项;如果大于,则在该原始的日志项的索引位置字段标识该原始的日志项为失效数据,更新对应的存储段Segment的失效数据信息;然后将更新后的日志项插入到头部指针处,并更新索引信息;否则,根据更新后的日志项的Value字段更新该原始的日志项的Value字段。
一种数据删除方法,其步骤包括:
1)对待删除数据value的关键字key进行哈希散列计算获得64位的哈希值;
2)取该哈希值的前16位为标签值tag,根据该哈希值后48位定位到哈希桶;
3)查找定位到的哈希桶的Tag字段中是否存在该标签值tag,若存在则返回该标签值对应的相对偏移量;如果不存在,且扩展桶字段不为空,则从该扩展桶字段指向的哈希桶中进行查找,直到找到该标签值tag或扩展桶字段为空;
4)根据返回的相对偏移量确定日志项并删除,然后将对应哈希桶的索引数字段的字段值减1、有效标志字段对应的位向量位置置为1,将该日志项的索引位置字段字段置为0,增加该日志项所在存储段Segment的失效数据量。
一种服务器,其特征在于,所述服务器包括链式日志存储结构、哈希索引结构、一用于完成查询功能的数据查询模块、一用于完成数据存储方法的数据存储模块、一用于完成数据更新方法的数据更新模块和一用于完成数据删除方法的数据删除模块。
一种计算机可读存储介质,其特征在于,存储链式日志存储结构、哈希索引结构、一用于完成数据存储方法的数据存储模块、一用于完成数据更新方法的数据更新模块和一用于完成数据删除方法的数据删除模块。
与现有技术方案相比,本发明技术方案具有的优点:
1、本申请中提出的哈希索引结构比现有的哈希结构在存储大量元素时查询速度更快。本发明通过充分利用cache的特性和SIMD指令集,减少了哈希冲突带来的链表遍历、二次哈希计算等额外开销,本发明对现有的哈希索引与本申请提出的哈希索引进行了索引性能测试,结果如图1所示。
从测试结果可以看到,随着数据量的增长,原有的哈希索引插入和查询延迟都呈线性增长,而块状哈希索引则基本保持稳定,在存储一千万条数据的情况下,块状哈希索引相比原有哈希索引平均插入速度快约300ns,平均查询速度快约230ns。
2、使用Chained Log数据存储结构比使用现有内存分配器动态申请内存空间拥有更低的内存碎片率。本发明通过向系统申请固定大小的内存段并拼接成在虚拟内存空间中紧密连续的内存段,使得数据可以连续存储,避免了现有内存分配器在内存分配时存在的内部碎片问题。
3、通过将失效数据较多的内存段中的数据迁移至Chained Log头部,保持整个结构内存的紧密连续性,降低碎片率。
附图说明
图1为索引性能测试结果图;
(a)插入性能测试结果,(b)查询性能测试结果;
图2为本发明数据存储管理结构图。
图3为哈希桶结构设计图。
具体实施方式
下面结合附图和实施例对本发明进行进一步详细描述。
本发明的数据存储管理结构的设计如图2所示。
该结构中每个Segment(存储段)的大小是2MB,数据从头部指针位置插入,若当前Segment剩余空间不足,则通过mmap调用申请一个新的Segment映射到当前Segment的邻接位置。使用一个数组存储所有Segment的元信息,每一元信息包括Segment起始地址、首元素(即Segment中的第一个日志项)地址、前后邻接Segment的元信息在数组中的存放位置(即前后邻接Segment元信息的数组下标,每个数组元素就是一个元信息结构体,之所以要存数组下标是因为本发明在索引结构中只使用了26个比特位来存储数组的下标,这样在存储了大量数据后该字段会溢出,此时就需要循环使用存储元信息的数组,新的Segment元信息会覆盖掉失效的Segment元信息),以及当前Segment的失效数据量。使用大顶堆统计TopK个失效数据量最多的Segment,当内存使用率低于配置阈值时,从大顶堆中获取失效数据与segment大小的比例最大的Segment对其进行迁移操作,本发明会将Segment中的有效数据重新插入到日志结构的头部位置,之后调用unmap释放空的Segment,保持内存空间的紧密连续。
Log Item(日志项)是Segment的存储单元,InitialSize(初始大小)字段是该Item的初始大小,用于判断日志项的更新策略。因为在该存储结构中数据都是连续存储的,当更新的数据大小大于初始大小时,如果采取就地更新策略则会覆盖紧邻的下一日志项,此时需要把旧的日志项删除,并把新的日志项插入到链式日志头部。Position(索引位置)字段存储该Item的索引在哈希表中的位置,用于支持数据的迁移,在对日志项进行删除或移动时,本发明需要快速反查到该日志项对应的索引项,并对其进行修改。KeyLength(键长度)字段存储关键字key的长度。Key(键)和Value(值)字段则分别存储数据的键值对数据内容。
第二个是哈希索引结构,哈希索引由多个哈希桶组成,每个哈希桶的数据结构如图3所示。
该结构中Num(索引数)字段存储该桶中的有效索引项数量,占用8bit。Flag(有效标志)字段是一个8bit的位向量,被置0的位表示对应的Tag(标签)段中的tagn的值是有效的,用于快速定位新索引项的插入位置。Tag字段是由7个占用16bit的tag组成,tag是key的64位哈希值的前16位,后48位用于在哈希表中定位哈希桶的下标。Offset(偏移量)字段是由7个占用48bit的offset组成,offset是数据的存储位置在链式日志存储结构中的相对偏移量,前26bit存储Segment的元信息数组下标,后22bit存储相对Segment首元素地址的偏移量。当该桶已满时,新的索引项会被插入到最近的空桶中,Next(扩展桶)字段用于记录该空桶的下标,占用48bit。
接下来详述该数据结构的操作流程。
1)对待查询数据value的关键字key进行哈希散列计算获得64位的哈希值hash。
2)取hash的前16位为tag,根据hash的后48位定位到哈希表中的哈希桶。
3)若Next字段不为空,调用prefetch将Next字段指向的数据映射到cache中。
4)使用SIMD指令集,比较tag和哈希桶的Tag字段,若找到则返回相应的offset值(比如说第3个tag字段,即t3与key的前16位相等,那么返回offset字段中对应的o3这个值;本发明的索引结构中,根据Key字段、Value字段中键值对的对应关系标签字段中的标签值与偏移字段中的相对偏移量一一对应),否则如果Next字段不为空且查找迭代次数低于5次,则回到步骤3,直到Next字段为空(即从该扩展桶字段指向的哈希桶中进行查找,直到找到该标签值tag或扩展桶字段为空)。
5)获取offset的值后,根据offset前26位从Segment元信息数组中获取Segment信息,并根据offset后22位的偏移量获取Log Item,返回结果。
1)对待存储数据value的关键字key进行哈希散列计算获得64位的哈希值hash。
2)取hash的前16位为tag,根据hash的后48位定位到哈希表中的哈希桶。
3)若哈希桶未满,则在Flag位向量中找到从左边起第一个置1的位,设置Tag中该位置的tag为hash的前16位,对应的offset前26位设置为Chained Log结构当前Segment的元信息数组下标,后22位设置为Head指针与当前Segment的首元素地址的差值。若哈希桶已满且Next字段为空,则采用平方探测的方法在哈希表中找到下一个非满桶,把Next字段赋值为该非满桶的下标,若Next不为空,则直接跳转到该字段标识的哈希桶,然后重复该步骤。
4)更新哈希桶的Num和Flag字段,Num加1,Flag相应的位置置0。
5)向Chained Log结构的Head指针处插入新的Item,若当前的Segment剩余空间不足,则通过mmap申请一个新的Segment映射到当前Segment的邻接位置,并更新Segment元信息数组,新Segment的首元素地址为当前Head指针的地址。
1)根据更新的Value长度和Log Item的Initial Size判断更新后的Item是否大于原始的Item。
2)如果大于原始的Item大小,则将该Item的Position字段置为0表示该Item为失效数据,更新该Segment的失效数据信息。把新的Item插入到Head指针处,并更新哈希表中的索引信息。
3)如果小于等于原始的Item大小,则只需更新Item的Value字段即可。
1)执行查找操作,找到相应的索引项和Item项。
2)更新索引项所在哈希桶的Num和Flag字段,Num减1,Flag向量相应位置置为1。
3)更新Item项的Position字段为0。
4)更新Segment元信息,增加该Segment的失效数据量。
Claims (7)
1.一种基于哈希索引结构的数据查询方法,其步骤包括:
1)对待查询数据value的关键字key进行哈希散列计算获得64位的哈希值;
2)取该哈希值的前16位为标签值tag,根据该哈希值后48位定位到哈希桶;
3)查找定位到的哈希桶的Tag字段中是否存在该标签值tag,若存在则返回该标签值对应的相对偏移量;如果不存在,且扩展桶字段不为空,则从该扩展桶字段指向的哈希桶中进行查找,直到找到该标签值tag或扩展桶字段为空;
4)根据返回的相对偏移量获取日志项,返回结果;
其中,所述哈希索引结构包括多个哈希桶,每一所述哈希桶的数据结构包括:索引数字段、有效标志字段、标签字段、偏移量字段和扩展桶字段;索引数字段,用于存储哈希桶中的有效索引项数量;有效标志字段是一位向量,该位向量的位数与标签字段中的标签数相同,该位向量中置0的位表示对应的标签值是有效的;标签字段中的标签值是Key字段中键的64位哈希值的前16位,后48位为哈希桶的下标;偏移量字段,用于存储Value字段中数据的存储位置在链式日志存储结构中的相对偏移量,根据Key字段、Value字段中键值对的对应关系标签字段中的标签值与偏移字段中的相对偏移量一一对应;当一哈希桶已满时,新的索引项会被插入到与该哈希桶最近的空哈希桶中,扩展桶字段用于记录该空哈希桶的下标;
其中所述链式日志存储结构包括多个存储段Segment和一数组,每一所述存储段Segment的存储单元为一日志项,所述日志项包括初始大小字段、索引位置字段、键长度字段、Key字段和Value字段;其中Value字段用于存储数据,Key字段用于存储数据的键,初始大小字段用于存储日志项的初始大小,索引位置字段用于存储日志项的索引在哈希表中的位置;所述数组用于存储各存储段Segment的元信息。
2.一种基于哈希索引结构的数据存储方法,其步骤包括:
1)对待存储数据value的关键字key进行哈希散列计算获得64位的哈希值;
2)取该哈希值的前16位为标签值tag,根据该哈希值的后48位定位到哈希桶;
3)若该哈希桶未满,则进行步骤4);若该哈希桶已满但扩展桶字段不为空,则选取该扩展桶字段标识的哈希桶,进行步骤4);若该哈希桶已满且扩展桶字段为空,则查找下一个非满哈希桶,把扩展桶字段赋值为该非满哈希桶的下标,然后进行步骤4);
4)在当前哈希桶的有效标志字段的位向量中找到一置1的位,设置标签字段中该位对应的标签值为该哈希值的前16位,偏移字段中对应的相对偏移量前26位设置为该待存储数据value要存入的存储段Segment的元信息数组下标,后22位设置为头部指针与该存储段Segment的首元素地址的差值;
5)更新哈希桶的索引数字段和有效标志字段,即索引数字段的字段值加1,有效标志字段对应的位向量位置置0;
6)向头部指针处插入新的日志项存储该待存储数据value,若当前的存储段Segment剩余空间不足,则申请一个新的存储段Segment映射到当前存储段Segment的邻接位置,并更新存储存储段Segment元信息的数组,新的存储段Segment的首元素地址为当前头部指针的地址;
其中,所述哈希索引结构包括多个哈希桶,每一所述哈希桶的数据结构包括:索引数字段、有效标志字段、标签字段、偏移量字段和扩展桶字段;索引数字段,用于存储哈希桶中的有效索引项数量;有效标志字段是一位向量,该位向量的位数与标签字段中的标签数相同,该位向量中置0的位表示对应的标签值是有效的;标签字段中的标签值是Key字段中键的64位哈希值的前16位,后48位为哈希桶的下标;偏移量字段,用于存储Value字段中数据的存储位置在链式日志存储结构中的相对偏移量,根据Key字段、Value字段中键值对的对应关系标签字段中的标签值与偏移字段中的相对偏移量一一对应;当一哈希桶已满时,新的索引项会被插入到与该哈希桶最近的空哈希桶中,扩展桶字段用于记录该空哈希桶的下标;
其中所述链式日志存储结构包括多个存储段Segment和一数组,每一所述存储段Segment的存储单元为一日志项,所述日志项包括初始大小字段、索引位置字段、键长度字段、Key字段和Value字段;其中Value字段用于存储数据,Key字段用于存储数据的键,初始大小字段用于存储日志项的初始大小,索引位置字段用于存储日志项的索引在哈希表中的位置;所述数组用于存储各存储段Segment的元信息。
3.一种基于哈希索引结构的数据更新方法,其步骤包括:判断更新后的日志项是否大于原始的日志项;如果大于,则在该原始的日志项的索引位置字段标识该原始的日志项为失效数据,更新对应的存储段Segment的失效数据信息;然后将更新后的日志项插入到头部指针处,并更新索引信息;否则,根据更新后的日志项的Value字段更新该原始的日志项的Value字段;其中,
所述哈希索引结构包括多个哈希桶,每一所述哈希桶的数据结构包括:索引数字段、有效标志字段、标签字段、偏移量字段和扩展桶字段;索引数字段,用于存储哈希桶中的有效索引项数量;有效标志字段是一位向量,该位向量的位数与标签字段中的标签数相同,该位向量中置0的位表示对应的标签值是有效的;标签字段中的标签值是Key字段中键的64位哈希值的前16位,后48位为哈希桶的下标;偏移量字段,用于存储Value字段中数据的存储位置在链式日志存储结构中的相对偏移量,根据Key字段、Value字段中键值对的对应关系标签字段中的标签值与偏移字段中的相对偏移量一一对应;当一哈希桶已满时,新的索引项会被插入到与该哈希桶最近的空哈希桶中,扩展桶字段用于记录该空哈希桶的下标;
其中所述链式日志存储结构包括多个存储段Segment和一数组,每一所述存储段Segment的存储单元为一日志项,所述日志项包括初始大小字段、索引位置字段、键长度字段、Key字段和Value字段;其中Value字段用于存储数据,Key字段用于存储数据的键,初始大小字段用于存储日志项的初始大小,索引位置字段用于存储日志项的索引在哈希表中的位置;所述数组用于存储各存储段Segment的元信息。
4.一种基于哈希索引结构的数据删除方法,其步骤包括:
1)对待删除数据value的关键字key进行哈希散列计算获得64位的哈希值;
2)取该哈希值的前16位为标签值tag,根据该哈希值后48位定位到哈希桶;
3)查找定位到的哈希桶的Tag字段中是否存在该标签值tag,若存在则返回该标签值对应的相对偏移量;如果不存在,且扩展桶字段不为空,则从该扩展桶字段指向的哈希桶中进行查找,直到找到该标签值tag或扩展桶字段为空;
4)根据返回的相对偏移量确定日志项并删除,然后将对应哈希桶的索引数字段的字段值减1、有效标志字段对应的位向量位置置为1,将该日志项的索引位置字段字段置为0,增加该日志项所在存储段Segment的失效数据量;
其中,所述哈希索引结构包括多个哈希桶,每一所述哈希桶的数据结构包括:索引数字段、有效标志字段、标签字段、偏移量字段和扩展桶字段;索引数字段,用于存储哈希桶中的有效索引项数量;有效标志字段是一位向量,该位向量的位数与标签字段中的标签数相同,该位向量中置0的位表示对应的标签值是有效的;标签字段中的标签值是Key字段中键的64位哈希值的前16位,后48位为哈希桶的下标;偏移量字段,用于存储Value字段中数据的存储位置在链式日志存储结构中的相对偏移量,根据Key字段、Value字段中键值对的对应关系标签字段中的标签值与偏移字段中的相对偏移量一一对应;当一哈希桶已满时,新的索引项会被插入到与该哈希桶最近的空哈希桶中,扩展桶字段用于记录该空哈希桶的下标;
其中所述链式日志存储结构包括多个存储段Segment和一数组,每一所述存储段Segment的存储单元为一日志项,所述日志项包括初始大小字段、索引位置字段、键长度字段、Key字段和Value字段;其中Value字段用于存储数据,Key字段用于存储数据的键,初始大小字段用于存储日志项的初始大小,索引位置字段用于存储日志项的索引在哈希表中的位置;所述数组用于存储各存储段Segment的元信息。
5.如权利要求1或2或3或4所述的方法,其特征在于,所述元信息包括存储段Segment的起始地址、首元素地址、前后邻接存储段Segment的元信息在数组中的存放位置,以及存储段Segment的失效数据量;所述前后邻接存储段Segment的元信息在数组中的存放位置为前后邻接存储段Segment元信息的数组下标;使用大顶堆统计失效数据量最多的前K个存储段Segment,当内存使用率低于配置阈值时,对大顶堆中失效数据与segment大小的比例最大的存储段Segment进行迁移操作,将该存储段Segment中的有效数据重新插入到链式日志存储结构的头部位置,之后释放空的存储段Segment;所述相对偏移量占用48bit,其中前26bit存储存储段Segment的元信息数组下标,后22bit存储相对存储段Segment首元素地址的偏移量。
6.一种服务器,其特征在于,所述服务器包括一用于完成如权利要求1所述查询功能的数据查询模块、一用于完成如权利要求2所述数据存储方法的数据存储模块、一用于完成如权利要求3所述数据更新方法的数据更新模块和一用于完成如权利要求4所述数据删除方法的数据删除模块。
7.一种计算机可读存储介质,其特征在于,一用于完成如权利要求1所述查询功能的数据查询模块、一用于完成如权利要求2所述数据存储方法的数据存储模块、一用于完成如权利要求3所述数据更新方法的数据更新模块和一用于完成如权利要求4所述数据删除方法的数据删除模块。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710606580.2A CN107515901B (zh) | 2017-07-24 | 2017-07-24 | 一种链式日志存储结构及其哈希索引结构、数据操作方法及服务器、介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710606580.2A CN107515901B (zh) | 2017-07-24 | 2017-07-24 | 一种链式日志存储结构及其哈希索引结构、数据操作方法及服务器、介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107515901A CN107515901A (zh) | 2017-12-26 |
CN107515901B true CN107515901B (zh) | 2020-12-04 |
Family
ID=60722440
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710606580.2A Active CN107515901B (zh) | 2017-07-24 | 2017-07-24 | 一种链式日志存储结构及其哈希索引结构、数据操作方法及服务器、介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107515901B (zh) |
Families Citing this family (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110109914B (zh) * | 2018-01-16 | 2024-08-23 | 恒为科技(上海)股份有限公司 | 一种应用驱动的数据存储与索引方法 |
CN109802992B (zh) * | 2018-12-10 | 2021-05-28 | 视联动力信息技术股份有限公司 | 一种资源变化日志读写的方法和装置 |
CN109766341B (zh) * | 2018-12-27 | 2022-04-22 | 厦门市美亚柏科信息股份有限公司 | 一种建立哈希映射的方法、装置、存储介质 |
CN109885496B (zh) * | 2019-02-20 | 2022-06-07 | 北京百佑科技有限公司 | 测试日志管理方法及系统 |
CN110188096B (zh) * | 2019-04-18 | 2021-08-17 | 创新先进技术有限公司 | 一种数据记录的索引创建方法、装置及设备 |
US10990705B2 (en) | 2019-04-18 | 2021-04-27 | Advanced New Technologies Co., Ltd. | Index creation for data records |
CN110457535A (zh) * | 2019-08-14 | 2019-11-15 | 广州虎牙科技有限公司 | 哈希桶查找方法、哈希表存储、哈希表查找方法和装置 |
CN112579623B (zh) * | 2019-09-29 | 2024-08-02 | 北京国双科技有限公司 | 存储数据的方法、装置、存储介质及设备 |
CN111177476B (zh) * | 2019-12-05 | 2023-08-18 | 北京百度网讯科技有限公司 | 数据查询方法、装置、电子设备及可读存储介质 |
CN111259203B (zh) * | 2020-01-08 | 2023-08-25 | 上海兆芯集成电路股份有限公司 | 数据压缩器以及数据压缩方法 |
CN111552693B (zh) * | 2020-04-30 | 2023-04-07 | 南方科技大学 | 一种标签布谷鸟过滤器 |
CN112162950B (zh) * | 2020-09-11 | 2022-11-15 | 杭州涂鸦信息技术有限公司 | 基于文件系统的数据处理方法、装置和计算机设备 |
CN112199333B (zh) * | 2020-09-24 | 2022-11-22 | 武汉绿色网络信息服务有限责任公司 | 一种支持多值索引文件的存储方法和装置 |
CN112395260B (zh) * | 2020-11-11 | 2022-11-15 | 深圳市云网万店科技有限公司 | 一种数据存储方法及介质 |
CN112597158A (zh) * | 2020-12-17 | 2021-04-02 | 平安普惠企业管理有限公司 | 数据匹配方法、装置、计算机设备和存储介质 |
CN112800006B (zh) * | 2021-01-27 | 2023-05-26 | 杭州迪普科技股份有限公司 | 用于网络设备的日志存储方法及装置 |
CN112732702B (zh) * | 2021-03-31 | 2021-06-25 | 腾讯科技(深圳)有限公司 | 数据库引擎文件处理方法及装置 |
CN112988754B (zh) * | 2021-04-08 | 2023-07-14 | 中煤科工集团重庆研究院有限公司 | 一种面向数据集成的快速查询方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1464436A (zh) * | 2002-06-26 | 2003-12-31 | 联想(北京)有限公司 | 嵌入式系统的数据存放及其查找组合方法 |
CN102541968A (zh) * | 2010-12-31 | 2012-07-04 | 百度在线网络技术(北京)有限公司 | 一种索引方法 |
KR20130064319A (ko) * | 2011-12-08 | 2013-06-18 | 한양대학교 에리카산학협력단 | 플래시 메모리 기반 저장 장치를 위한 하이브리드 해시 인덱스 |
CN104618361A (zh) * | 2015-01-22 | 2015-05-13 | 中国科学院计算技术研究所 | 一种网络流数据重排序方法 |
CN106033420A (zh) * | 2015-03-11 | 2016-10-19 | 杭州华三通信技术有限公司 | 哈希表的处理方法及装置 |
-
2017
- 2017-07-24 CN CN201710606580.2A patent/CN107515901B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1464436A (zh) * | 2002-06-26 | 2003-12-31 | 联想(北京)有限公司 | 嵌入式系统的数据存放及其查找组合方法 |
CN102541968A (zh) * | 2010-12-31 | 2012-07-04 | 百度在线网络技术(北京)有限公司 | 一种索引方法 |
KR20130064319A (ko) * | 2011-12-08 | 2013-06-18 | 한양대학교 에리카산학협력단 | 플래시 메모리 기반 저장 장치를 위한 하이브리드 해시 인덱스 |
CN104618361A (zh) * | 2015-01-22 | 2015-05-13 | 中国科学院计算技术研究所 | 一种网络流数据重排序方法 |
CN106033420A (zh) * | 2015-03-11 | 2016-10-19 | 杭州华三通信技术有限公司 | 哈希表的处理方法及装置 |
Non-Patent Citations (3)
Title |
---|
"Redis++: A High Performance In-Memory Database Based on Segmented Memory Management and Two-Level Hash Index";peng zhang;《2018 IEEE Intl Conf on Parallel & Distributed Processing with Applications, Ubiquitous Computing & Communications, Big Data & Cloud Computing, Social Computing & Networking, Sustainable Computing & Communications》;20181213;840-847 * |
"基于GPU的内存数据库索引技术研究";刘勇;《中国博士学位论文全文数据库 信息科技辑》;20140515;I138-26 * |
ninggou yang."MES: A memory-efficient key-value storage with user-level network stack".《2018 IEEE 3rd International Conference on Big Data Analysis (ICBDA)》.2018,156-161. * |
Also Published As
Publication number | Publication date |
---|---|
CN107515901A (zh) | 2017-12-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107515901B (zh) | 一种链式日志存储结构及其哈希索引结构、数据操作方法及服务器、介质 | |
US9471500B2 (en) | Bucketized multi-index low-memory data structures | |
CN108255958B (zh) | 数据查询方法、装置和存储介质 | |
JP6356675B2 (ja) | 集約/グループ化動作:ハッシュテーブル法のハードウェア実装 | |
US8397080B2 (en) | Scalable segment-based data de-duplication system and method for incremental backups | |
US6052697A (en) | Reorganization of collisions in a hash bucket of a hash table to improve system performance | |
CN107491523B (zh) | 存储数据对象的方法及装置 | |
US9292554B2 (en) | Thin database indexing | |
CN101464901B (zh) | 一种对象存储设备中的对象查找方法 | |
JP2015512604A (ja) | 暗号ハッシュ・データベース | |
CN105117417A (zh) | 一种读优化的内存数据库Trie树索引方法 | |
US8225060B2 (en) | Data de-duplication by predicting the locations of sub-blocks within the repository | |
CN113094336B (zh) | 基于Cuckoo哈希的文件系统目录管理方法及系统 | |
CN104462141A (zh) | 一种数据存储与查询的方法、系统及存储引擎装置 | |
CN114860627B (zh) | 基于地址信息动态生成页表的方法 | |
KR20230026946A (ko) | 해싱을 사용하는 키 밸류 스토리지 장치 및 그것의 동작 방법 | |
US9292553B2 (en) | Queries for thin database indexing | |
CN108804571B (zh) | 一种数据存储方法、装置以及设备 | |
CN116627345A (zh) | 应用于海量value键值对的高性能KV缓存方法及装置 | |
CN111625198A (zh) | 一种元数据缓存方法和元数据缓存装置 | |
Al-Saleh et al. | Radix path: A reduced bucket size oram for secure cloud storage | |
Suh et al. | Extent mapping scheme for flash memory devices | |
US11899642B2 (en) | System and method using hash table with a set of frequently-accessed buckets and a set of less frequently-accessed buckets | |
CN114398373A (zh) | 应用于数据库存储的文件数据存储读取方法及装置 | |
CN114416741A (zh) | 基于多级索引的kv数据写入读取方法、装置及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |