CN116627345A - 应用于海量value键值对的高性能KV缓存方法及装置 - Google Patents
应用于海量value键值对的高性能KV缓存方法及装置 Download PDFInfo
- Publication number
- CN116627345A CN116627345A CN202310648094.2A CN202310648094A CN116627345A CN 116627345 A CN116627345 A CN 116627345A CN 202310648094 A CN202310648094 A CN 202310648094A CN 116627345 A CN116627345 A CN 116627345A
- Authority
- CN
- China
- Prior art keywords
- data
- value
- key value
- read
- key
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 82
- 239000010410 layer Substances 0.000 claims abstract description 68
- 239000002344 surface layer Substances 0.000 claims abstract description 28
- 238000013500 data storage Methods 0.000 claims abstract description 13
- 230000008569 process Effects 0.000 claims description 19
- 238000004364 calculation method Methods 0.000 claims description 6
- 238000004422 calculation algorithm Methods 0.000 description 3
- 230000006399 behavior Effects 0.000 description 2
- 238000004590 computer program Methods 0.000 description 2
- 238000012217 deletion Methods 0.000 description 2
- 230000037430 deletion Effects 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 230000006870 function Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000000644 propagated effect Effects 0.000 description 2
- 230000009471 action Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 239000002355 dual-layer Substances 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0655—Vertical data movement, i.e. input-output transfer; data movement between one or more hosts and one or more storage devices
- G06F3/0656—Data buffering arrangements
-
- 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
-
- 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/2272—Management thereof
-
- 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
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/061—Improving I/O performance
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/0625—Power saving in storage systems
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Databases & Information Systems (AREA)
- Human Computer Interaction (AREA)
- Data Mining & Analysis (AREA)
- Software Systems (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了应用于海量value键值对的高性能KV缓存方法,包括:在写入KV数据时,根据key值确定KV数据存储的存储桶bucket;每个所述的存储桶bucket包括:内存表层,包括跳跃表,包括至少一个只读跳跃表和一个读写跳跃表,当读写跳跃表中写入的KV数据达到预设值时,则转换为只读跳跃表,并新生成一个读写跳跃表;数据组层,使用定长空间的数组存储所述只读跳跃表中的KV数据,包括索引区和数据区,所述数据区连续存储各个item数据,每个item数据包括写入key值大小的keySize、key值和value值,所述的索引区存储对应数据区的item起始地址offset,所述的key值大小keySize和起始地址offset均为定长存储。本发明提出内存表层+数据组层的双层架构,保证了读写的高性能,极大降低了内存消耗。
Description
技术领域
本发明涉及数据存储技术领域,具体的涉及应用于海量value键值对的高性能KV缓存方法及装置。
背景技术
KV缓存为了读写的高性能,将数据存储在内存,由于内存资源有限,就需要思考如何用有限的内存存储更多的数据。
而当前业界KV缓存,使用高级数据结构存储数据,其内部结构的内存消耗占比较高,比如跳跃表(skiplist),在高度为20层的情况下,单node消耗的内存达到184B。比如redis存储10GB的数据,就需要消耗18GB的内存空间。
那么用原生语言go的map存储如何?map中数据都由buckets存储,每个bucket自身内存结构就需要消耗280B。在存储的value到GB级别时,消耗的内存能达到数据量的10倍以上。
因此,现有实现KV缓存的数据结构存在数据结构本身消耗较多内存的技术问题,有鉴于此,特提出本发明专利。
发明内容
为了解决上述内存消耗问题,本发明提出一种应用于海量value键值对的高性能KV缓存方法及装置,本发明的技术方案在存储海量小value键值对的场景下,消耗的内存更低,同时能保持高性能。具体地,采用了如下技术方案:
应用于海量value键值对的高性能KV缓存方法,包括:
在写入KV数据时,根据key值确定KV数据存储的存储桶bucket;
每个所述的存储桶bucket包括:
内存表层,包括跳跃表,所述的跳跃表包括至少一个只读跳跃表和一个读写跳跃表,当读写跳跃表中写入的KV数据达到预设值时,则转换为只读跳跃表,并新生成一个读写跳跃表;
数据组层,使用定长空间的数组存储所述只读跳跃表中的KV数据,包括索引区和数据区,所述数据区连续存储各个item数据,每个item数据包括写入key值大小的keySize、key值和value值,所述的索引区存储对应数据区的item起始地址offset,所述的key值大小keySize和起始地址offset均为定长存储。
作为本发明的可选实施方式,本发明的应用于海量value键值对的高性能KV缓存方法,包括KV数据写入流程,所述的KV数据写入流程包括:
数据组层中数据区从尾到头写入数据;
依次将只读跳跃表中KV数据的key值和value值写入数据区,根据写入的key值确定key值大小keySize并写入,将所述key值大小keySize、key值和value值按照相同key值作为一个item数据。
作为本发明的可选实施方式,本发明的应用于海量value键值对的高性能KV缓存方法,所述的KV数据写入流程包括:
获取每个写入的item数据中key值大小keySize的存储地址;
将所述存储地址作为item数据存储的起始地址offset按照从头到尾写入索引区;
可选地,所述的key值大小keySize采用定长的uintB1存储,所述的起始地址offset采用定长的uintB2存储,所述的uintB2>uintB1。
作为本发明的可选实施方式,本发明的应用于海量value键值对的高性能KV缓存方法,包括KV数据读取流程,所述KV数据读取流程包括读取数据组层中的数组数据:
采用二分法查找索引区,得到索引区中间起始地址offset[i]为当前索引;
通过当前索引的起始地址offset[i]与下一索引的起始地址offset[i+1]之间的差值,计算得到当前索引对应item数据的总大小itemSize=offset[i+1]-offset[i];
通过当前索引的起始地址offset[i]、item数据的总大小itemSize和key值大小keySize的存储长度uintB1得到key值+value值区域的起始地址kvOffset;
通过当前索引的起始地址offset[i]读取数据区item数据的key值大小keySize,根据key值+value值区域的起始地址kvOffset和key值大小keySize读取得到key值和value值。
作为本发明的可选实施方式,本发明的应用于海量value键值对的高性能KV缓存方法,包括KV数据查询流程,所述的KV数据查询流程包括:
接收输入的查询key值;
在所述内存表层中读取读写跳跃表的数据,判断是否存在与查询key值相同的KV数据;
若在所述读写跳跃表中未读取到与查询key值相同的KV数据,则在所述内存表层中读取只读跳跃表的数据,判断是否存在与查询key值相同的KV数据;
若在所述只读跳跃表中未读取到与查询key值相同的KV数据,则在所述数据组层中读取数组数据;
读取得到当前key值,比较当前key值与查询key值之间的关系,若当前key值=查询key值,则返回当前key值对应的value值为查询结果,若当前key值≠查询key值,则根据当前key值与查询key值确定数据组层中索引区的查询区间,继续执行数组读取流程,直至查询到查询key值或者查询完数据组层中的全部数据。
作为本发明的可选实施方式,本发明的应用于海量value键值对的高性能KV缓存方法中,所述的KV数据写入流程包括:
判断内存是否达到额定限制;
若判断结果为否,则写入KV数据,若判断结果为是,则读取所要写入KV数据的key值判断当前内存是否存在,存在则继续写入,不存在,则拒绝写入当前内存。
作为本发明的可选实施方式,本发明的应用于海量value键值对的高性能KV缓存方法,包括KV数据合并流程,所述的KV数据合并流程包括:
通过常驻协程每间隔预设时间间隔T针对各个存储桶bucket顺序进行内存清除;
将只读跳跃表和数据组层进行数据合并,生成新的数据组层,然后删除只读跳跃表和旧的数据组层。
作为本发明的可选实施方式,本发明的应用于海量value键值对的高性能KV缓存方法中,所述在写入KV数据时,根据key值确定KV数据存储的存储桶bucket包括:
预设N个存储桶bucket;
在写入KV数据时,针对key值进行哈希计算得到哈希key值;
将哈希key值对N取模,确定KV数据所写入的存储桶bucket。
本发明同时提供应用于海量value键值对的高性能KV缓存装置,包括:
存储桶bucket模块,在写入KV数据时,根据key值确定KV数据存储的存储桶bucket;
每个所述的存储桶bucket模块包括:
内存表层模块,包括跳跃表,所述的跳跃表包括至少一个只读跳跃表和一个读写跳跃表,当读写跳跃表中写入的KV数据达到预设值时,则转换为只读跳跃表,并新生成一个读写跳跃表;
数据组层模块,使用定长空间的数组存储所述只读跳跃表中的KV数据,包括索引区和数据区,所述数据区连续存储各个item数据,每个item数据包括写入key值大小的keySize、key值和value值,所述的索引区存储对应数据区的item起始地址offset,所述的key值大小keySize和起始地址offset均为定长存储。
10.一种计算机可读存储介质,其特征在于,存储有计算机可执行程序,所述计算机可执行程序被执行时,实现如权利要求1-8任意一项所述应用于海量value键值对的高性能KV缓存方法。
与现有技术相比,本发明的有益效果:
本发明的应用于海量value键值对的高性能KV缓存方法在进行KV数据缓存,以存储10GB数据为例,设置128个存储桶bucket进行KV数据缓存,每个存储桶bucket包含2个skiplist,1个数组,每个skiplist和每个数组的定长空间均为40MB,则一个存储桶bucket所消耗的内存为40MB*2+40MB=120MB,128个存储桶bucket总共消耗内存120MB*128=15360MB,因此,理论上存储10GB数据,需要15GB的内存空间,本发明的数据结构消耗的内存空间为5GB。相较于背景技术中采用skiplist数据结构,存储10GB数据,需要消耗18GB的内存空间,其中skiplist数据结构消耗内存空间8GB,本发明的应用于海量value键值对的高性能KV缓存方法,在存储海量小value键值对的场景下,消耗的内存更低,同时能保持高性能。
本发明的应用于海量value键值对的高性能KV缓存方法的关键点是用内存表层(memtable)在上层承载读写流量,实现内存表层(memtable)的skiplist去掉了删除行为,用CAS(Compare and Swap指比较并交换)算法替换显式的锁,实现无锁,读写性能更佳。用定长的数据组层(arraytable)存储变长的数据,减少内存消耗,且读性能和skiplist一样。用单独协程flush将内存表层(memtable)的数据顺序写入到数据组层(arraytable),同时删除过期和重复数据。
因此,本发明的应用于海量value键值对的高性能KV缓存方法,针对小value的缓存耗费大量内存问题,本发明提出用无锁的skiplist实现的内存表层(memtable)+数据组层(arraytable)的双层架构,保证了读写的高性能,用最基本的数据类型数组存储数据,极大降低了内存消耗。
附图说明:
图1本发明实施应用于海量value键值对的高性能KV缓存方法的数据结构示意图;
图2本发明实施例应用于海量value键值对的高性能KV缓存方法的数据组层的数据结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图,对本发明实施例中的技术方案进行清楚、完整的描述。显然,所描述的实施例是本发明的一部分实施例,而不是全部的实施例。
因此,以下对本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的部分实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征和技术方案可以相互组合。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
在本发明的描述中,需要说明的是,术语“上”、“下”等指示的方位或位置关系为基于附图所示的方位或位置关系,或者是该发明产品使用时惯常摆放的方位或位置关系,或者是本领域技术人员惯常理解的方位或位置关系,这类术语仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
本实施例的应用于海量value键值对的高性能KV缓存方法,包括:
在写入KV数据时,根据key值确定KV数据存储的存储桶bucket;
参见图1所示,每个所述的存储桶bucket包括:
内存表层(memtable),包括跳跃表(skiplist),所述的跳跃表(skiplist)包括至少一个只读跳跃表和一个读写跳跃表,当读写跳跃表中写入的KV数据达到预设值时,则转换为只读跳跃表,并新生成一个读写跳跃表;
数据组层(arraytable),参见图2所示,使用定长空间的数组存储所述只读跳跃表中的KV数据,包括索引区和数据区,所述数据区连续存储各个item数据,每个item数据包括写入key值大小的keySize、key值和value值,所述的索引区存储对应数据区的item起始地址offset,所述的key值大小keySize和起始地址offset均为定长存储。
本实施例的应用于海量value键值对的高性能KV缓存方法在进行KV数据缓存,以存储10GB数据为例,设置128个存储桶bucket进行KV数据缓存,每个存储桶bucket包含2个skiplist,1个数组,每个skiplist和每个数组的定长空间均为40MB,则一个存储桶bucket所消耗的内存为40MB*2+40MB=120MB,128个存储桶bucket总共消耗内存120MB*128=15360MB,因此,理论上存储10GB数据,需要15GB的内存空间,本实施例的数据结构消耗的内存空间为5GB。相较于背景技术中采用skiplist数据结构,存储10GB数据,需要消耗18GB的内存空间,其中skiplist数据结构消耗内存空间8GB,本实施例的应用于海量value键值对的高性能KV缓存方法,在存储海量小value键值对的场景下,消耗的内存更低,同时能保持高性能。
本实施例的应用于海量value键值对的高性能KV缓存方法的关键点是用内存表层(memtable)在上层承载读写流量,实现内存表层(memtable)的skiplist去掉了删除行为,用CAS(Compare and Swap指比较并交换)算法替换显式的锁,实现无锁,读写性能更佳。用定长的数据组层(arraytable)存储变长的数据,减少内存消耗,且读性能和skiplist一样。用单独协程flush将内存表层(memtable)的数据顺序写入到数据组层(arraytable),同时删除过期和重复数据。
因此,本实施例的应用于海量value键值对的高性能KV缓存方法,针对小value的缓存耗费大量内存问题,本实施例提出用无锁的skiplist实现的内存表层(memtable)+数据组层(arraytable)的双层架构,保证了读写的高性能,用最基本的数据类型数组存储数据,极大降低了内存消耗。
作为本实施例的可选实施方式,本实施例的应用于海量value键值对的高性能KV缓存方法,包括KV数据写入流程,所述的KV数据写入流程包括:
数据组层中数据区从尾到头写入数据;
依次将只读跳跃表中KV数据的key值和value值写入数据区,根据写入的key值确定key值大小keySize并写入,将所述key值大小keySize、key值和value值按照相同key值作为一个item数据。
进一步地,本实施例的应用于海量value键值对的高性能KV缓存方法中,所述的KV数据写入流程包括:
获取每个写入的item数据中key值大小keySize的存储地址;
将所述存储地址作为item数据存储的起始地址offset按照从头到尾写入索引区。
可选地,所述的key值大小keySize采用定长的uintB1存储,所述的起始地址offset采用定长的uintB2存储,所述的uintB2>uintB1。
作为本实施例的可选实施方式,参见图1所示,本实施例每个存储桶bucket分两层:
第一层:
使用n个skiplist,skiplist按照功能分为两种,一种是可读写,一种是只读。数据写入可写的skiplist,当大小达到40MB时,新生成一个,旧的转化为只读。可读写的skiplist只保持一个,只读的有可能多个。
第二层:
使用定长空间40MB的数组,数组分索引区和数据区,参见图2所示:
索引区从头到尾写入,每个值用uint32存储对应数据区的一个item起始地址offset。
数据区从尾到头开始写,连续存储每个item的keySize和key、value,keySize由一个uint16存储。
skiplist是有序的,写入数组也是顺序写入。
因此,本实施例的应用于海量value键值对的高性能KV缓存方法,数据组层(arraytable)中的数据是连续紧凑的,存储一个KV,除了数据本身,额外只消耗1个uint32的索引和1个uint16的keySize,总大小为6字节。对比gomap和skiplist,极大减少了内存消耗。
作为本实施例的可选实施方式,本实施例的应用于海量value键值对的高性能KV缓存方法,包括KV数据读取流程,所述KV数据读取流程包括读取数据组层中的数组数据:
采用二分法查找索引区,得到索引区中间起始地址offset[i]为当前索引;
通过当前索引的起始地址offset[i]与下一索引的起始地址offset[i+1]之间的差值,计算得到当前索引对应item数据的总大小itemSize=offset[i+1]-offset[i];
通过当前索引的起始地址offset[i]、item数据的总大小itemSize和key值大小keySize的存储长度uintB1得到key值+value值区域的起始地址kvOffset;
通过当前索引的起始地址offset[i]读取数据区item数据的key值大小keySize,根据key值+value值区域的起始地址kvOffset和key值大小keySize读取得到key值和value值。
进一步地,本实施例的应用于海量value键值对的高性能KV缓存方法,先读可写skiplist,如果没有则读只读skiplist,如果没有再读取数组。读取skiplist为logN,读取数组也是logN。
进一步地,本实施例的应用于海量value键值对的高性能KV缓存方法,包括KV数据查询流程,所述的KV数据查询流程包括:
接收输入的查询key值;
在所述内存表层中读取读写跳跃表的数据,判断是否存在与查询key值相同的KV数据;
若在所述读写跳跃表中未读取到与查询key值相同的KV数据,则在所述内存表层中读取只读跳跃表的数据,判断是否存在与查询key值相同的KV数据;
若在所述只读跳跃表中未读取到与查询key值相同的KV数据,则在所述数据组层中读取数组数据;
读取得到当前key值,比较当前key值与查询key值之间的关系,若当前key值=查询key值,则返回当前key值对应的value值为查询结果,若当前key值≠查询key值,则根据当前key值与查询key值确定数据组层中索引区的查询区间,继续执行数组读取流程,直至查询到查询key值或者查询完数据组层中的全部数据。
作为本实施例的可选实施方式,本实施例的应用于海量value键值对的高性能KV缓存方法中,所述的KV数据写入流程包括:
判断内存是否达到额定限制;
若判断结果为否,则写入KV数据,若判断结果为是,则读取所要写入KV数据的key值判断当前内存是否存在,存在则继续写入,不存在,则拒绝写入当前内存。
本实施例的应用于海量value键值对的高性能KV缓存方法,包括KV数据合并流程,所述的KV数据合并流程包括:
通过常驻协程每间隔预设时间间隔T针对各个存储桶bucket顺序进行内存清除;
将只读跳跃表和数据组层进行数据合并,生成新的数据组层,然后删除只读跳跃表和旧的数据组层。
本实施例的一个常驻协程,间隔T分钟(该时间可根据流量情况配置调整)对128个bucket顺序flush,将只读的skiplist,和第二层的数组merge,生成新的数组,然后删除只读skiplist和旧的数组。单次flush,最多使用1个skiplist和1个数组的内存,避免128个bucket同时flush所造成的内存抖动。
作为本实施例的可选实施方式,本实施例的应用于海量value键值对的高性能KV缓存方法中,所述在写入KV数据时,根据key值确定KV数据存储的存储桶bucket包括:
预设N个存储桶bucket;
在写入KV数据时,针对key值进行哈希计算得到哈希key值;
将哈希key值对N取模,确定KV数据所写入的存储桶bucket。
假设我们存储10GB的数据,分128个bucket(降低7次查询次数),写入kv时,对key进行hash计算,再对128取模,存储到其中一个bucket。
本实施例同时提供应用于海量value键值对的高性能KV缓存装置,包括:
存储桶bucket模块,在写入KV数据时,根据key值确定KV数据存储的存储桶bucket;
每个所述的存储桶bucket模块包括:
内存表层模块,包括跳跃表,所述的跳跃表包括至少一个只读跳跃表和一个读写跳跃表,当读写跳跃表中写入的KV数据达到预设值时,则转换为只读跳跃表,并新生成一个读写跳跃表;
数据组层模块,使用定长空间的数组存储所述只读跳跃表中的KV数据,包括索引区和数据区,所述数据区连续存储各个item数据,每个item数据包括写入key值大小的keySize、key值和value值,所述的索引区存储对应数据区的item起始地址offset,所述的key值大小keySize和起始地址offset均为定长存储。
本实施例的应用于海量value键值对的高性能KV缓存装置,在进行KV数据缓存,以存储10GB数据为例,存储桶bucket模块设置128个存储桶bucket进行KV数据缓存,每个存储桶bucket包含2个skiplist,1个数组,每个skiplist和每个数组的定长空间均为40MB,则一个存储桶bucket所消耗的内存为40MB*2+40MB=120MB,128个存储桶bucket总共消耗内存120MB*128=15360MB,因此,理论上存储10GB数据,需要15GB的内存空间,本实施例的数据结构消耗的内存空间为5GB。相较于背景技术中采用skiplist数据结构,存储10GB数据,需要消耗18GB的内存空间,其中skiplist数据结构消耗内存空间8GB,本实施例的应用于海量value键值对的高性能KV缓存装置,在存储海量小value键值对的场景下,消耗的内存更低,同时能保持高性能。
本实施例的应用于海量value键值对的高性能KV缓存装置的关键点是用内存表层模块(memtable模块)在上层承载读写流量,实现内存表层(memtable)的skiplist去掉了删除行为,用CAS(Compare and Swap指比较并交换)算法替换显式的锁,实现无锁,读写性能更佳。用定长的数据组层模块(arraytable模块)存储变长的数据,减少内存消耗,且读性能和skiplist一样。用单独协程flush将内存表层模块(memtable模块)的数据顺序写入到数据组层模块(arraytable模块),同时删除过期和重复数据。
因此,本实施例的应用于海量value键值对的高性能KV缓存装置,针对小value的缓存耗费大量内存问题,本实施例提出用无锁的skiplist实现的内存表层(memtable)+数据组层(arraytable)的双层架构,保证了读写的高性能,用最基本的数据类型数组存储数据,极大降低了内存消耗。
作为本实施例的可选实施方式,本实施例的应用于海量value键值对的高性能KV缓存装置,包括KV数据写入模块,所述的KV数据写入模块进行KV数据写入流程包括:
数据组层模块中数据区从尾到头写入数据;
依次将只读跳跃表中KV数据的key值和value值写入数据区,根据写入的key值确定key值大小keySize并写入,将所述key值大小keySize、key值和value值按照相同key值作为一个item数据。
进一步地,本实施例的应用于海量value键值对的高性能KV缓存装置,所述的KV数据写入模块进行KV数据写入流程包括:
获取每个写入的item数据中key值大小keySize的存储地址;
将所述存储地址作为item数据存储的起始地址offset按照从头到尾写入索引区。
可选地,所述的key值大小keySize采用定长的uintB1存储,所述的起始地址offset采用定长的uintB2存储,所述的uintB2>uintB1。
作为本实施例的可选实施方式,参见图1所示,本实施例每个存储桶bucket模块分两层:
第一层,内存表层模块:
使用n个skiplist,skiplist按照功能分为两种,一种是可读写,一种是只读。数据写入可写的skiplist,当大小达到40MB时,新生成一个,旧的转化为只读。可读写的skiplist只保持一个,只读的有可能多个。
第二层,数据组层模块:
使用定长空间40MB的数组,数组分索引区和数据区,参见图2所示:
索引区从头到尾写入,每个值用uint32存储对应数据区的一个item起始地址offset。
数据区从尾到头开始写,连续存储每个item的keySize和key、value,keySize由一个uint16存储。
skiplist是有序的,写入数组也是顺序写入。
因此,本实施例的应用于海量value键值对的高性能KV缓存装置,数据组层模块中的数据是连续紧凑的,存储一个KV,除了数据本身,额外只消耗1个uint32的索引和1个uint16的keySize,总大小为6字节。对比go map和skiplist,极大减少了内存消耗。
作为本实施例的可选实施方式,本实施例的应用于海量value键值对的高性能KV缓存装置,包括KV数据读取模块,所述KV数据读取模块进行KV数据读取流程包括读取数据组层模块中的数组数据:
采用二分法查找索引区,得到索引区中间起始地址offset[i]为当前索引;
通过当前索引的起始地址offset[i]与下一索引的起始地址offset[i+1]之间的差值,计算得到当前索引对应item数据的总大小itemSize=offset[i+1]-offset[i];
通过当前索引的起始地址offset[i]、item数据的总大小itemSize和key值大小keySize的存储长度uintB1得到key值+value值区域的起始地址kvOffset;
通过当前索引的起始地址offset[i]读取数据区item数据的key值大小keySize,根据key值+value值区域的起始地址kvOffset和key值大小keySize读取得到key值和value值。
进一步地,本实施例的应用于海量value键值对的高性能KV缓存装置,KV数据读取模块进行KV数据读取流程,先读可写skiplist,如果没有则读只读skiplist,如果没有再读取数组。读取skiplist为logN,读取数组也是logN。
进一步地,本实施例的应用于海量value键值对的高性能KV缓存装置,包括KV数据查询模块,KV数据查询执行KV数据查询流程包括:
KV数据查询模块接收输入的查询key值;
在所述内存表层模块中读取读写跳跃表的数据,判断是否存在与查询key值相同的KV数据;
若在所述读写跳跃表中未读取到与查询key值相同的KV数据,则在所述内存表层模块中读取只读跳跃表的数据,判断是否存在与查询key值相同的KV数据;
若在所述只读跳跃表中未读取到与查询key值相同的KV数据,则在所述数据组层模块中读取数组数据;
读取得到当前key值,比较当前key值与查询key值之间的关系,若当前key值=查询key值,则返回当前key值对应的value值为查询结果,若当前key值≠查询key值,则根据当前key值与查询key值确定数据组层模块中索引区的查询区间,继续执行数组读取流程,直至查询到查询key值或者查询完数据组层中的全部数据。
作为本实施例的可选实施方式,本实施例的应用于海量value键值对的高性能KV缓存装置,所述的KV数据写入模块执行KV数据写入流程包括:
判断内存是否达到额定限制;
若判断结果为否,则写入KV数据,若判断结果为是,则读取所要写入KV数据的key值判断当前内存是否存在,存在则继续写入,不存在,则拒绝写入当前内存。
本实施例的应用于海量value键值对的高性能KV缓存装置,包括KV数据合并模块,KV数据合并模块执行KV数据合并流程包括:
通过常驻协程每间隔预设时间间隔T针对各个存储桶bucket顺序进行内存清除;
将只读跳跃表和数据组层进行数据合并,生成新的数据组层,然后删除只读跳跃表和旧的数据组层。
本实施例的一个常驻协程,间隔T分钟(该时间可根据流量情况配置调整)对128个bucket顺序flush,将只读的skiplist,和第二层的数组merge,生成新的数组,然后删除只读skiplist和旧的数组。单次flush,最多使用1个skiplist和1个数组的内存,避免128个bucket同时flush所造成的内存抖动。
作为本实施例的可选实施方式,本实施例的应用于海量value键值对的高性能KV缓存装置,KV数据写入模块执行KV数据写入流程时,根据key值确定KV数据存储的存储桶bucket包括:
预设N个存储桶bucket;
在写入KV数据时,针对key值进行哈希计算得到哈希key值;
将哈希key值对N取模,确定KV数据所写入的存储桶bucket。
假设我们存储10GB的数据,分128个bucket(降低7次查询次数),写入kv时,对key进行hash计算,再对128取模,存储到其中一个bucket。
本实施例同时提供一种计算机可读存储介质,存储有计算机可执行程序,所述计算机可执行程序被执行时,实现所述应用于海量value键值对的高性能KV缓存方法。
本实施例所述计算机可读存储介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读存储介质还可以是可读存储介质以外的任何可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读存储介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、RF等等,或者上述的任意合适的组合。
本实施例还提供了一种电子设备,包括处理器和存储器,所述存储器用于存储计算机可执行程序,当所述计算机程序被所述处理器执行时,所述处理器执行所述应用于海量value键值对的高性能KV缓存方法。
电子设备以通用计算设备的形式表现。其中处理器可以是一个,也可以是多个并且协同工作。本发明也不排除进行分布式处理,即处理器可以分散在不同的实体设备中。本发明的电子设备并不限于单一实体,也可以是多个实体设备的总和。
所述存储器存储有计算机可执行程序,通常是机器可读的代码。所述计算机可读程序可以被所述处理器执行,以使得电子设备能够执行本发明的方法,或者方法中的至少部分步骤。
所述存储器包括易失性存储器,例如随机存取存储单元(RAM)和/或高速缓存存储单元,还可以是非易失性存储器,如只读存储单元(ROM)。
应当理解,本发明的电子设备中还可以包括上述示例中未示出的元件或组件。例如,有些电子设备中还包括有显示屏等显示单元,有些电子设备还包括人机交互元件,例如按钮、键盘等。只要该电子设备能够执行存储器中的计算机可读程序以实现本发明方法或方法的至少部分步骤,均可认为是本发明所涵盖的电子设备。
通过以上对实施方式的描述,本领域的技术人员易于理解,本发明可以由能够执行特定计算机程序的硬件来实现,例如本发明的系统,以及系统中包含的电子处理单元、服务器、客户端、手机、控制单元、处理器等。本发明也可以由执行本发明的方法的计算机软件来实现,例如由微处理器、电子控制单元,客户端、服务器端等执行的控制软件来实现。但需要说明的是,执行本发明的方法的计算机软件并不限于由一个或特定个的硬件实体中执行,其也可以是由不特定具体硬件的以分布式的方式来实现。对于计算机软件,软件产品可以存储在一个计算机可读的存储介质(可以是CD-ROM,U盘,移动硬盘等)中,也可以分布式存储于网络上,只要其能使得电子设备执行根据本发明的方法。
以上实施例仅用以说明本发明而并非限制本发明所描述的技术方案,尽管本说明书参照上述的各个实施例对本发明已进行了详细的说明,但本发明不局限于上述具体实施方式,因此任何对本发明进行修改或等同替换;而一切不脱离发明的精神和范围的技术方案及其改进,其均涵盖在本发明的权利要求范围当中。
Claims (10)
1.应用于海量value键值对的高性能KV缓存方法,其特征在于,包括:
在写入KV数据时,根据key值确定KV数据存储的存储桶bucket;
每个所述的存储桶bucket包括:
内存表层,包括跳跃表,所述的跳跃表包括至少一个只读跳跃表和一个读写跳跃表,当读写跳跃表中写入的KV数据达到预设值时,则转换为只读跳跃表,并新生成一个读写跳跃表;
数据组层,使用定长空间的数组存储所述只读跳跃表中的KV数据,包括索引区和数据区,所述数据区连续存储各个item数据,每个item数据包括写入key值大小的keySize、key值和value值,所述的索引区存储对应数据区的item起始地址offset,所述的key值大小keySize和起始地址offset均为定长存储。
2.根据权利要求1所述的应用于海量value键值对的高性能KV缓存方法,其特征在于,包括KV数据写入流程,所述的KV数据写入流程包括:
数据组层中数据区从尾到头写入数据;
依次将只读跳跃表中KV数据的key值和value值写入数据区,根据写入的key值确定key值大小keySize并写入,将所述key值大小keySize、key值和value值按照相同key值作为一个item数据。
3.根据权利要求2所述的应用于海量value键值对的高性能KV缓存方法,其特征在于,所述的KV数据写入流程包括:
获取每个写入的item数据中key值大小keySize的存储地址;
将所述存储地址作为item数据存储的起始地址offset按照从头到尾写入索引区;
可选地,所述的key值大小keySize采用定长的uintB1存储,所述的起始地址offset采用定长的uintB2存储,所述的uintB2>uintB1。
4.根据权利要求3所述的应用于海量value键值对的高性能KV缓存方法,其特征在于,包括KV数据读取流程,所述KV数据读取流程包括读取数据组层中的数组数据:
采用二分法查找索引区,得到索引区中间起始地址offset[i]为当前索引;
通过当前索引的起始地址offset[i]与下一索引的起始地址offset[i+1]之间的差值,计算得到当前索引对应item数据的总大小itemSize=offset[i+1]-offset[i];
通过当前索引的起始地址offset[i]、item数据的总大小itemSize和key值大小keySize的存储长度uintB1得到key值+value值区域的起始地址kvOffset;
通过当前索引的起始地址offset[i]读取数据区item数据的key值大小keySize,根据key值+value值区域的起始地址kvOffset和key值大小keySize读取得到key值和value值。
5.根据权利要求4所述的应用于海量value键值对的高性能KV缓存方法,其特征在于,包括KV数据查询流程,所述的KV数据查询流程包括:
接收输入的查询key值;
在所述内存表层中读取读写跳跃表的数据,判断是否存在与查询key值相同的KV数据;
若在所述读写跳跃表中未读取到与查询key值相同的KV数据,则在所述内存表层中读取只读跳跃表的数据,判断是否存在与查询key值相同的KV数据;
若在所述只读跳跃表中未读取到与查询key值相同的KV数据,则在所述数据组层中读取数组数据;
读取得到当前key值,比较当前key值与查询key值之间的关系,若当前key值=查询key值,则返回当前key值对应的value值为查询结果,若当前key值≠查询key值,则根据当前key值与查询key值确定数据组层中索引区的查询区间,继续执行数组读取流程,直至查询到查询key值或者查询完数据组层中的全部数据。
6.根据权利要求4所述的应用于海量value键值对的高性能KV缓存方法,其特征在于,所述的KV数据写入流程包括:
判断内存是否达到额定限制;
若判断结果为否,则写入KV数据,若判断结果为是,则读取所要写入KV数据的key值判断当前内存是否存在,存在则继续写入,不存在,则拒绝写入当前内存。
7.根据权利要求4所述的应用于海量value键值对的高性能KV缓存方法,其特征在于,包括KV数据合并流程,所述的KV数据合并流程包括:
通过常驻协程每间隔预设时间间隔T针对各个存储桶bucket顺序进行内存清除;
将只读跳跃表和数据组层进行数据合并,生成新的数据组层,然后删除只读跳跃表和旧的数据组层。
8.根据权利要求1所述的应用于海量value键值对的高性能KV缓存方法,其特征在于,所述在写入KV数据时,根据key值确定KV数据存储的存储桶bucket包括:
预设N个存储桶bucket;
在写入KV数据时,针对key值进行哈希计算得到哈希key值;
将哈希key值对N取模,确定KV数据所写入的存储桶bucket。
9.应用于海量value键值对的高性能KV缓存装置,其特征在于,包括:
存储桶bucket模块,在写入KV数据时,根据key值确定KV数据存储的存储桶bucket;
每个所述的存储桶bucket模块包括:
内存表层模块,包括跳跃表,所述的跳跃表包括至少一个只读跳跃表和一个读写跳跃表,当读写跳跃表中写入的KV数据达到预设值时,则转换为只读跳跃表,并新生成一个读写跳跃表;
数据组层模块,使用定长空间的数组存储所述只读跳跃表中的KV数据,包括索引区和数据区,所述数据区连续存储各个item数据,每个item数据包括写入key值大小的keySize、key值和value值,所述的索引区存储对应数据区的item起始地址offset,所述的key值大小keySize和起始地址offset均为定长存储。
10.一种计算机可读存储介质,其特征在于,存储有计算机可执行程序,所述计算机可执行程序被执行时,实现如权利要求1-8任意一项所述应用于海量value键值对的高性能KV缓存方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310648094.2A CN116627345A (zh) | 2023-06-02 | 2023-06-02 | 应用于海量value键值对的高性能KV缓存方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310648094.2A CN116627345A (zh) | 2023-06-02 | 2023-06-02 | 应用于海量value键值对的高性能KV缓存方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116627345A true CN116627345A (zh) | 2023-08-22 |
Family
ID=87641598
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310648094.2A Pending CN116627345A (zh) | 2023-06-02 | 2023-06-02 | 应用于海量value键值对的高性能KV缓存方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116627345A (zh) |
-
2023
- 2023-06-02 CN CN202310648094.2A patent/CN116627345A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Wei et al. | Xstore: Fast rdma-based ordered key-value store using remote learned cache | |
US11080260B2 (en) | Concurrent reads and inserts into a data structure without latching or waiting by readers | |
US9858303B2 (en) | In-memory latch-free index structure | |
Bortnikov et al. | Accordion: Better memory organization for LSM key-value stores | |
US9727479B1 (en) | Compressing portions of a buffer cache using an LRU queue | |
US11314689B2 (en) | Method, apparatus, and computer program product for indexing a file | |
KR20200122994A (ko) | 키 값 첨부 | |
US11113195B2 (en) | Method, device and computer program product for cache-based index mapping and data access | |
CN103501319A (zh) | 一种低延迟的面向小文件的分布式存储系统 | |
Rumble | Memory and object management in RAMCloud | |
CN109376125A (zh) | 一种元数据存储方法、装置、设备及计算机可读存储介质 | |
Nguyen et al. | Zing database: high-performance key-value store for large-scale storage service | |
CN107408132B (zh) | 跨越多个类型的存储器移动分层数据对象的方法和系统 | |
Tao et al. | LHF: A new archive based approach to accelerate massive small files access performance in HDFS | |
CN112148736A (zh) | 缓存数据的方法、设备及存储介质 | |
Tulkinbekov et al. | CaseDB: Lightweight key-value store for edge computing environment | |
US20220342888A1 (en) | Object tagging | |
Shim | PHash: A memory-efficient, high-performance key-value store for large-scale data-intensive applications | |
CN110832473B (zh) | 日志结构管理系统及方法 | |
Liu et al. | TSCache: an efficient flash-based caching scheme for time-series data workloads | |
CN112463073A (zh) | 一种对象存储分布式配额方法、系统、设备和存储介质 | |
US20200349186A1 (en) | Method, apparatus and computer program product for managing metadata of storage object | |
CN108804571B (zh) | 一种数据存储方法、装置以及设备 | |
Wang et al. | Optimization of LevelDB by separating key and value | |
CN116627345A (zh) | 应用于海量value键值对的高性能KV缓存方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |