一种实现多索引内存数据并发读写的方法
技术领域
本发明涉及一种实现多索引内存数据并发读写的方法。
背景技术
多索引内存数据,是指可对同一条数据建立多个索引,通过任意一个索引都可以访问到该数据。map是其一对一的特殊情况.对其进行读写需要保证在并发场景下的安全性和正确性;目前多对一的数据结构,存在并发控制的问题,大多数都是通过加一个全局锁去控制并发读写,使得并发读写性能急剧下降。
发明内容
本发明所要解决的技术问题是提供一种实现多索引内存数据并发读写的方法,尽量消除全局锁,在保证并发安全性的前提下提升并发读写性能。
本发明实现多索引内存数据并发读写的方法是通过以下技术方案来实现的:具体包括以下几个步骤:
S1、将一数据结构分为索引区和数据区;
S2、采用linux的读写锁API加全局写锁来写数据;
S3、读数据,开始不加全局锁;
S4、设置索引,设置一个索引函数,根据数据内容计算出一个值当做索引值,这个索引值就是索引表的key;
S5、通过索引读取到数据后,对数据做一个校验,保证此数据与索引值匹配;
作为优选的技术方案,在S1中,索引区包含多个索引,每个索引基于hash表实现,此hash表的key为索引字段值,value为一个数值。
作为优选的技术方案,在S5中,利用S4中设置的索引函数计算出key值,再跟查询数据时传入的索引值做对比,如相同,则表明数据是正确的,否则需要循环读取3次,如还是不正确,此时再加一个全局的读锁,再做一次读取。
本发明的有益效果是:本发明能尽量消除全局锁,在保证并发安全性的前提下提升并发读写性能。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明的总体框架图。
具体实施方式
本说明书中公开的所有特征,或公开的所有方法或过程中的步骤,除了互相排斥的特征和/或步骤以外,均可以以任何方式组合。
本说明书(包括任何附加权利要求、摘要和附图)中公开的任一特征,除非特别叙述,均可被其他等效或具有类似目的的替代特征加以替换。即,除非特别叙述,每个特征只是一系列等效或类似特征中的一个例子而已。
在本发明的描述中,需要理解的是,术语“一端”、“另一端”、“外侧”、“上”、“内侧”、“水平”、“同轴”、“中央”、“端部”、“长度”、“外端”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。
此外,在本发明的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。
本发明使用的例如“上”、“上方”、“下”、“下方”等表示空间相对位置的术语是出于便于说明的目的来描述如附图中所示的一个单元或特征相对于另一个单元或特征的关系。空间相对位置的术语可以旨在包括设备在使用或工作中除了图中所示方位以外的不同方位。例如,如果将图中的设备翻转,则被描述为位于其他单元或特征“下方”或“之下”的单元将位于其他单元或特征“上方”。因此,示例性术语“下方”可以囊括上方和下方这两种方位。设备可以以其他方式被定向,并相应地解释本文使用的与空间相关的描述语。
在本发明中,除非另有明确的规定和限定,术语“设置”、“套接”、“连接”、“贯穿”、“插接”等术语应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或成一体;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通或两个元件的相互作用关系,除非另有明确的限定。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本发明中的具体含义。
如图1所示,本发明的一种实现多索引内存数据并发读写的方法,具体包括以下几个步骤:
S1、将一数据结构分为索引区和数据区;
S2、采用linux的读写锁API加全局写锁来写数据;限制了并发写,保证了索引等数据结构的安全性。
S3、读数据,开始不加全局锁;其中读数据是支持并发的,并且不会被写阻塞。
S4、设置索引,设置一个索引函数,根据数据内容计算出一个值当做索引值,这个索引值就是索引表的key;以C++语言为例(方法不限于C++),其索引函数原型:
typedef int(*IndexKeyCallFunc)(const void*value,int value_len,char*key,int&key_len)
其中value,value_len是入参,表示数据,key,key_len是出参,表示计算会后的key内容;
例如数据是一个结构体:
指定索引函数,以id字段为主键索引:
这表明可以通过数据内容反向计算出索引值;每个索引都对应一个索引函数。
S5、通过索引读取到数据后,对数据做一个校验,保证此数据与索引值匹配;
本实施例中,在S1中,索引区包含多个索引,每个索引基于hash表实现,此hash表的key为索引字段值,value为一个数值;该数值可以用来对数据区寻址,是数据区中数据的编号;数据区保存的是实际的数据。
本实施例中,在S5中,利用S4中设置的索引函数计算出key值,再跟查询数据时传入的索引值做对比,如相同,则表明数据是正确的,否则需要循环读取3次,如还是不正确,此时再加一个全局的读锁,再做一次读取;此时必定能得到一个正确的结果;在高并发下,有极低概率校验不通过,因此这里可以极大降低加全局锁的概率,大大提升并发读写性能。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何不经过创造性劳动想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书所限定的保护范围为准。
- 上一篇:石墨接头机器人自动装卡簧、装栓机
- 下一篇:多表分页查询方法、装置、设备及存储介质