CN107451070A - 一种数据的处理方法和服务器 - Google Patents
一种数据的处理方法和服务器 Download PDFInfo
- Publication number
- CN107451070A CN107451070A CN201610381737.1A CN201610381737A CN107451070A CN 107451070 A CN107451070 A CN 107451070A CN 201610381737 A CN201610381737 A CN 201610381737A CN 107451070 A CN107451070 A CN 107451070A
- Authority
- CN
- China
- Prior art keywords
- value
- server
- array location
- location
- address space
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/10—Providing a specific technical effect
- G06F2212/1016—Performance improvement
- G06F2212/1024—Latency reduction
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/10—Providing a specific technical effect
- G06F2212/1032—Reliability improvement, data loss prevention, degraded operation etc
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种数据的处理方法和服务器,用于减少数据读取时延,保证数据处理的可靠性。本发明提供一种数据的处理方法,包括:服务器获取数据读写指令,所述数据读写指令包括:用于读写操作处理的第一键;所述服务器根据所述第一键从该服务器本地的进程地址空间中定位出所述第一键对应的第一值在第一数组单元中的存储位置,所述进程地址空间包括:通过位图bitmap方式存储有值的连续多个数组单元,所述第一数组单元为所述进程地址空间中的一个数组单元;所述服务器根据所述存储位置从所述第一数组单元中确定出所述第一值,并按照所述数据读写指令对确定出的所述第一值进行读写操作处理。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种数据的处理方法和服务器。
背景技术
随着互联网的发展以及移动终端设备接入互联网服务的普遍性,对后台服务器的服务程序性能要求越来越高,特别是在对一些小数据量进行存储,或者是读多写少的业务场景。为了增强服务的可靠性以及容灾能力,常常在业务服务系统的存储层中增加一个缓冲层(英文名称:cache),目前在业务服务系统中可以部署内存cache组件,用于降低用户访问延时,提升用户体验。但是部署内存cache组件需要专门的机器部署才能实现,部署完成后才能在程序运行中进行网络通信,或者进行数据编解码。当存储层的接入设备出现单机故障时,影响面较广,造成大量用户不可访问。
在高并发、多设备和多进程的情况下并发访问存储层时,采用内存cache组件的方式将会占用大量的传输控制协议(英文全称:Transmission Control Protocol,英文简称:TCP)链接。此时,总链接数目的限制将会是业务服务系统的一个瓶颈,业务服务系统将会把后面的链接进行排队处理,进而增加了数据读取的延时。另外,目前采用的内存cache组件依赖于网络通信,对于集中式数据存储,需要进行网络通信才能获取到存储数据,这严重依赖外部服务和网络通信质量,若外部服务和网络通信存在故障,就会导致数据不可处理。因此存在高延时和可靠性不强的问题。
发明内容
本发明实施例提供了一种数据的处理方法和服务器,用于减少数据读取时延,保证数据处理的可靠性。
为解决上述技术问题,本发明实施例提供以下技术方案:
第一方面,本发明实施例提供一种数据的处理方法,包括:
服务器获取数据读写指令,所述数据读写指令包括:用于读写操作处理的第一键;
所述服务器根据所述第一键从该服务器本地的进程地址空间中定位出所述第一键对应的第一值在第一数组单元中的存储位置,所述进程地址空间包括:通过位图bitmap方式存储有值的连续多个数组单元,所述第一数组单元为所述进程地址空间中的一个数组单元;
所述服务器根据所述存储位置从所述第一数组单元中确定出所述第一值,并按照所述数据读写指令对确定出的所述第一值进行读写操作处理。
第二方面,本发明实施例还提供一种服务器,包括:
指令获取模块,用于获取数据读写指令,所述数据读写指令包括:用于读写操作处理的第一键;
存储位置定位模块,用于根据所述第一键从该服务器本地的进程地址空间中定位出所述第一键对应的第一值在第一数组单元中的存储位置,所述进程地址空间包括:通过位图bitmap方式存储有值的连续多个数组单元,所述第一数组单元为所述进程地址空间中的一个数组单元;
数据处理模块,用于根据所述存储位置从所述第一数组单元中确定出所述第一值,并按照所述数据读写指令对确定出的所述第一值进行读写操作处理。
从以上技术方案可以看出,本发明实施例具有以下优点:
在本发明实施例中,首先服务器获取数据读写指令,数据读写指令包括:用于读写操作处理的第一键,然后服务器根据第一键从该服务器本地的进程地址空间中定位出第一键对应的第一值在第一数组单元中的存储位置,进程地址空间包括:通过bitmap方式存储有值的连续多个数组单元,第一数组单元为进程地址空间中的一个数组单元,最后服务器根据存储位置从第一数组单元中确定出第一值,并按照数据读写指令对确定出的第一值进行读写操作处理。由于本发明实施例中服务器在该服务器本地设置有进程地址空间,因此服务器接收到数据读写指令后只需要根据第一键来从本地的进程地址空间中就可以获取到第一值,本发明实施例完全可以解除数据存储对外部存储服务的依赖,服务器可以实现独立的单机读写数据,从而降低网络流量,减少数据读取时延,保证数据处理的可靠性。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的技术人员来讲,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种数据的处理方法的流程方框示意图;
图2为本发明实施例中服务器中基于bitmap组件和多个进程交互的示意图;
图3为本发明实施例提供的数组单元的实现方式示意图;
图4为本发明实施例提供的数组单元中存储value的实现方式示意图;
图5为本发明实施例中为数组单元中的value取值进行置位操作的示意图;
图6为本发明实施例中对数组单元中的value取值进行偏移操作的示意图;
图7-a为本发明实施例提供的一种服务器的组成结构示意图;
图7-b为本发明实施例提供的另一种服务器的组成结构示意图;
图7-c为本发明实施例提供的另一种服务器的组成结构示意图;
图7-d为本发明实施例提供的一种存储位置定位模块的组成结构示意图;
图7-e为本发明实施例提供的一种数据处理模块的组成结构示意图;
图7-f为本发明实施例提供的另一种数据处理模块的组成结构示意图;
图7-g为本发明实施例提供的另一种数据处理模块的组成结构示意图;
图8为本发明实施例提供的数据的处理方法应用于服务器的组成结构示意图。
具体实施方式
本发明实施例提供了一种数据的处理方法和服务器,用于减少数据读取时延,保证数据处理的可靠性。
为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,下面所描述的实施例仅仅是本发明一部分实施例,而非全部实施例。基于本发明中的实施例,本领域的技术人员所获得的所有其他实施例,都属于本发明保护的范围。
本发明的说明书和权利要求书及上述附图中的术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,以便包含一系列单元的过程、方法、系统、产品或设备不必限于那些单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它单元。
以下分别进行详细说明。
本发明数据的处理方法的一个实施例,具体可以应用于后台服务器对数据的存储管理中,例如可以应用于业务服务系统中。请参阅图1所示,本发明一个实施例提供的数据的处理方法,可以包括如下步骤:
101、服务器获取数据读写指令,数据读写指令包括:用于读写操作处理的第一键(英文名称:key)。
在本发明实施例中,服务器的本机可以提供数据的存储管理,当用户需要从服务器中读取或者写入数据时,用户可以通过客户端向服务器发送数据读写指令。在实际应用中,用户可以根据具体业务场景来确定需要从服务器中读取数据还是向服务器写入数据,此处不做限定。具体的,服务器可以从该数据读写指令中解析出该数据读写指令中包括的key值,其中,在数据读写指令中携带的key值用“第一键”来表示,也称为“第一key”。需要说明的是,数据读写指令包括用于读写操作处理的第一key,该第一key可以由用户来指定。
在本发明实施例中,服务器本地存储有key对应的值(英文名称:value),该服务器可以不通过外界网络来管理需要存储的数据。服务器确定出可用于读写操作处理的第一key之后,可以根据第一key从服务器本地来获取到该第一key对应的value,为便于描述,本发明实施例中将第一key对应的value定义为第一value,该第一value的具体获取过程可以参阅后续步骤的详细说明。
在本发明实施例的一些实施例中,本发明实施例提供的数据的处理方法还可以包括如下步骤:
A1、服务器在服务器的本地内存中创建共享内存;
A2、服务器将创建的共享内存映射到该服务器本地的进程地址空间中。
具体的,步骤A1至A2可以在服务器初始启动时就运行,也可以在本发明实施例中执行步骤101之前或者之后来运行,进程地址空间的创建可以取决于服务器中具体运行的多个进程。本发明实施例中可以通过共享内存来建立进程地址空间,例如服务器在每次启动运行时,首先会判断共享内存是否已经从该服务器的本地内存中创建出来,如果没有,则服务器可以创建共享内存,然后将共享内存附加到进程地址空间,例如可以是一片连续的进程地址空间,业务进程就可以实时对存储在服务器本地的进程地址空间中的value数据进行读写操作处理。
在本发明实施例的一些实施例中,本发明实施例提供的数据的处理方法还可以包括如下步骤:
B1、服务器根据需要存储的多个值中的最大值确定进程地址空间中的数组单元的容量和多个值中每个值占用的最大比特(英文名称:bit)个数。
其中,在本发明的上述实施例中,服务器可以根据业务服务所需要存储的value的数据规模确定出需要存储的多个value中的最大值,根据最大值的value所需要占用的存储空间可以确定进程地址空间中单个value存储所需占用的最大比特个数,该最大比特个数是指需要存储的多个value中的最大值所对应的比特数。进程地址空间中每个数组单元中可容纳的value个数也可以确定下来,因此进程地址空间中数组单元的容量也可以确定下来。举例说明如下,在服务器启动的时候根据业务需求分配足够的共享内存容量,具体需要的内存可以根据不同的业务场景,事先进行评估计算得出。根据value的最大值来决定单个value占用的最大bit个数,因此可以根据所需要存储的value的最大值来选择够用的内存空间即可,从而可以有效的降低内存的使用量,提高服务器的存储性能,降低服务成本。value占用的bit个数,决定了这个value的最大值,例如比如bit个数为3,则最大可以表示8进制数据,即value的最大值为7。
在目前常采用的内存cache组件,无论需要存储多大的数据,都会为value预留出4个字节大小的存储空间,而这会极大的浪费存储空间,增加了服务器成本。比如需要存储的数据是4进制的数据,那么其实只需要2bit的存储空间就足够了,而不需要占用4字节的存储空间。因此在目前的内存cache组件的实现方案中还存在对存储空间的浪费问题,而本发明实施例中是根据需要存储的value的最大值来选择合适的数组单元的容量以及value所需要的最大比特个数,相比于目前的内存cache组件中采用固定存储空间,具有更大的灵活性,以及对服务器本地内存的高效利用。
102、服务器根据第一键从该服务器本地的进程地址空间中定位出第一键对应的第一值在第一数组单元中的存储位置,进程地址空间包括:通过位图(英文名称:bitmap)方式存储有值的连续多个数组单元,第一数组单元为进程地址空间中的一个数组单元。
在本发明实施例中,服务器确定用于读写操作处理的第一key之后,服务器可以根据该第一key来查找该服务器本地的进程地址空间,该第一key对应的第一value存储在服务器本地的进程地址空间中,因此服务器不需要通过TCP链接和外部存储服务进行网络通信,本发明实施例服务器完全可以解除数据存储对外部存储服务的依赖,服务器可以实现独立的单机读写数据,从而降低网络流量,减少数据读取时延。
本发明实施例中,该服务器采用了基于本服务器本地的存储工具来实现对value数据的存储,该服务器在本地建立有进程地址空间,value数据都保存在进程地址空间中,服务器创建的进程地址空间由每个进程中的线性地址区组成,进程地址空间中包括有允许进程使用该空间的空间地址。每个进程在内存中都有唯一的空间地址,而且进程地址空间之间可以彼此独立。本发明实施例中服务器本地的进程地址空间包括:通过bitmap方式存储有value的连续多个数组单元,该数组单元也可以描述为“数组”,通过bitmap方式存储在地址进程空间中的数组单元可以是连续的。本发明实施例中进程地址空间中具体可以通过服务器中的bitmap组件来建立进程地址空间中的数组单元,value都可以存储到进程地址空间中的数组单元内,有效的减少对服务器的内存使用量。bitmap组件可以是提供简单初始化和读写接口的程序,在bitmap存储方式中,用一个bit位来标记某个元素对应的value,而key即是这个元素。由于采用bit为单位来存储数据,因此在可以大大的节省存储空间。
在本发明实施例中,服务器本地的进程地址空间中存储有多个连续的数组单元,该第一key对应的第一value存储在该进程地址空间的某个数组单元内,根据value在进程地址空间中具体采用的存储配置方式来确定该第一value具体存储在那个数组单元中,按照value在进程地址空间中的存储配置方式来对第一key对应的第一value进行数据存储空间定位,从而确定出第一value在进程地址空间中存储到的数组单元中的存储位置,将该数组单元定义为第一数组单元,则该第一数组单元为进程地址空间中的一个数组单元,该第一数组单元具体表示进程地址空间中的哪个数组单元可以结合第一value的存储配置来确定。
在本发明的一些实施例中,步骤102服务器根据第一键从该服务器本地的进程地址空间中定位出第一键对应的第一值在第一数组单元中的存储位置,具体可以包括如下步骤:
C1、服务器根据第一键从进程地址空间中确定出第一数组单元,第一数组单元的索引值通过对第一键的取值按照第一值占用的最大比特个数进行偏移后得到;
C2、服务器根据第一值占用的最大比特个数和第一键的取值确定第一值在第一数组单元中存储时使用的位置偏移量;
C3、服务器从第一数组单元的索引值开始,按照位置偏移量在第一数组单元中进行偏移操作,则完成上述偏移操作后所指向的空间地址即为第一值在第一数组单元中的存储位置。
其中,步骤C1中,服务器首先根据第一key的取值来确定第一value在进程地址空间中存储到的数组单元的索引值(英文名称:index),例如第一value在进程地址空间中存储时采用了按照第一value占用的最大比特个数进行偏移然后存储了第一数组单元,那么通过第一key在确定出第一数组单元时可以按照第一value占用的最大比特个数进行偏移来确定出数组单元的索引值,该索引值对应的数组单元即为第一数组单元。其中,对第一key在第一数组单元中的偏移方向可以根据具体应用场景来确定,例如可以对第一key的取值按照第一value占用的最大比特个数进行向右偏移。步骤C2中,为了对进程地址空间中的数组单元内的空间充分利用,在存储第一value时可以根据第一value占用的最大比特个数和第一key的取值确定出第一value在进程地址空间的第一数组单元中存储时使用的位置偏移量,该位置偏移量描述了第一value在第一数组单元中存储时所偏移的具体比特数。步骤C3中,第一数组单元的索引值指示了第一数组单元的起始位置,通过步骤C2计算出的位置偏移量可以确定从第一数组单元的索引值开始需要偏移多少空间位置才能找到第一value在第一数组单元中的存储位置,服务器从第一数组单元的索引值开始,按照位置偏移量在第一数组单元中进行偏移操作,则完成上述偏移操作后所指向的空间地址即为第一value在第一数组单元中的存储位置。
103、服务器根据存储位置从第一数组单元中确定出第一值,并按照数据读写指令对确定出的第一值进行读写操作处理。
在本发明实施例中,服务器定位出第一key对应的第一value在第一数组单元中的存储位置之后,服务器可以从第一数组单元中确定出第一value,服务器根据获取到的数据读写指令对确定出的第一value进行读写操作处理。如果数据读写指令具体为数据读取指令,则服务器可以从第一数组单元中读取到该第一value,若数据读写指令具体为数据写入指令,则服务器可以对第一数组单元中存储的第一value进行修改,详细后续实施例的进一步描述。
在本发明的一些实施例中,在前述执行步骤C1至C3所示的应用场景中,步骤103服务器根据存储位置从第一数组单元中确定出第一value,并按照数据读写指令对确定出的第一value进行读写操作处理,具体可以包括如下步骤:
D1、当数据读写指令具体为数据读取指令时,服务器将第一数组单元中存储的值从进程地址空间中读取出;
D2、服务器将第一数组单元中从完成上述偏移操作后所指向的空间地址开始,长度为最大比特个数的存储空间内存储的值的取值保持不变,将第一数组单元中除从空间地址开始长度为最大比特个数的存储空间以外的其它存储空间中存储的值置为0,得到第一数组单元中存储的临时值;
D3、服务器按照位置偏移量在第一数组单元中对临时值进行偏移操作,并读取出第一数组单元中完成偏移操作后得到的值,该读取出的值即为第一值。
其中,在本发明的上述应用场景中描述了需要读取value数据时的处理方式,此时服务器获取到的数据读写指令具体表示的是数据读取指令,步骤D1中可以将第一数组单元中存储的value都从进程地址空间中读取出,例如根据第一key确定出第一value所在的第一数组单元,为了快速计算出该第一value,可以将第一数组单元中的所有value都读取出,然后执行步骤D2,服务器将第一数组单元中从完成上述偏移操作后所指向的空间地址(即存储第一value的存储位置)开始,长度为最大比特个数的存储空间内存储的value即为第一value,第一数组单元从该空间地址开始长度为最大比特个数存储空间内存储的value的取值保持不变,将第一数组单元中除从空间地址开始长度为最大比特个数的存储空间以外的其它存储空间中存储的value置为0,得到第一数组单元中存储的临时value,此时在第一数组单元中存储的临时value中只保存有第一value对应的数值,但是该数值还不是数据读取指令需要读取到的十进制的第一value,此时可以继续执行步骤D3,服务器按照位置偏移量在第一数组单元中对第一数组单元中存储的临时value进行偏移操作,并读取出第一数组单元中完成偏移操作后得到的value,该读取出的value即为第一value,通过位置偏移量进行偏移操作后,可以将临时value转换为十进制的value数据,即为需要读取到的第一value。
在本发明的一些实施例中,在前述执行步骤C1至C3所示的应用场景中,步骤103服务器根据存储位置从第一数组单元中确定出第一值,并按照数据读写指令对确定出的第一值进行读写操作处理,具体可以包括如下步骤:
E1、当数据读写指令具体为数据写入指令时,服务器将第一数组单元中存储的值从进程地址空间中读取出,数据写入指令还包括:与第一键对应的需要写入到进程地址空间的第二值;
E2、服务器将第一数组单元中从完成上述偏移操作后所指向的空间地址开始,长度为最大比特个数的存储空间内存储的值的取值置为0,将第一数组单元中除从空间地址开始长度为最大比特个数的存储空间以外的其它存储空间中存储的值保持不变,得到第一数组单元中存储的更新前值;
E3、服务器将数据写入指令中携带的第二值按照位置偏移量进行偏移操作,得到完成偏移后的第二值;
E4、服务器对更新前值和完成偏移后的第二值进行按位取或操作,得到第一数组单元中存储的更新后值;
E5、服务器将存储更新后值的第一数组单元替换掉进程地址空间中存储的第一数组单元。
其中,在本发明的上述应用场景中描述了需要写入value数据时的处理方式,此时服务器获取到的数据读写指令具体表示的是数据写入指令,步骤E1中,服务器可以从数据写入指令中解析出需要写入到进程地址空间的第二value,该第二value是需要替换在进程地址空间中原来存储的第一value。步骤E1中服务器首先将第一数组单元中存储的value都从进程地址空间中读取出,例如根据第一key确定出第一value所在的第一数组单元,为了快速计算出该第一value,可以将第一数组单元中的所有value都读取出,然后执行步E2,服务器将第一数组单元中从完成上述偏移操作后所指向的空间地址(即存储第一value的存储位置)开始,长度为最大比特个数的存储空间内存储的value即为第一value,第一数组单元从该空间地址开始长度为最大比特个数存储空间内存储的value的取值置为0,即可以先从第一数组空间中存储第一value的存储空间中将第一value的值清除掉,以便于填入第二value,将第一数组单元中除从空间地址开始长度为最大比特个数的存储空间以外的其它存储空间中存储的value保持不变,得到第一数组单元中存储的更新前value,该更新前value表示的是第一数组单元中清除掉原来写入的第一value,第一数组单元中除需要清除的第一value以外其它存储空间中存储的value数据保持不变。在步骤E3中、服务器将数据写入指令中携带的第二value按照位置偏移量进行偏移操作,得到完成偏移后的第二value,对第二value进行偏移操作,是为了第二value移位到原来存储第一value的存储位置,然后执行步骤E4,服务器对更新前value和完成偏移后的第二value进行按位取或操作,得到第一数组单元中存储的更新后value,第一数组单元中更新前value中的第一value通过步骤E2被清除掉,此时再写入完成偏移后的第二value,从而可以得到写入友第二value的第一数组单元,最后可以执行步骤E5,服务器将存储更新后value的第一数组单元替换掉进程地址空间中存储的第一数组单元,第一key对应的原value数据(被第一value)被替换掉,从而完成第二value成功写入到进程地址空间。
进一步的,在本发明的前述实施例中,步骤103具体可以通过步骤E1至E5的详细描述来实现,如果出现多个进程都对第一值进行写入操作处理时,步骤103服务器根据存储位置从第一数组单元中确定出第一值,并按照数据读写指令对确定出的第一值进行读写操作处理,还可以包括如下步骤:
E6、服务器得到第一数组单元中存储的更新后值之后,服务器判断进程地址空间中的第一数组单元中存储的值与服务器从进程地址空间中读取出的值是否相同;
E7、当进程地址空间中的第一数组单元中存储的值与服务器从进程地址空间中读取出的值相同时,触发执行如下步骤E5:服务器将存储更新后值的第一数组单元替换掉进程地址空间中存储的第一数组单元;
E8、当进程地址空间中的第一数组单元中存储的值与服务器从进程地址空间中读取出的值不相同时,重新读取出进程地址空间的第一数组单元中存储的值,并重新获取第一数组单元中存储的更新后值。
其中,通过步骤E4获取到第一数组单元中存储的更新后value之后,若存在多个进程都可能对第一value进行修改的情况,本发明实施例中在执行步骤E5之前,还可以执行步骤E6,判断进程地址空间中的第一数组单元中存储的value与服务器从进程地址空间中读取出的value是否相同,若在执行不追E1至步骤E4期间第一数组单元中存储的value被其它进程修改过,则需要执行步骤E8,再次执行步骤E1至E4,重新读取出进程地址空间的第一数组单元中存储的value,并重新获取第一数组单元中存储的更新后value,然后再次执行步骤E6的判断。本发明实施例中,步骤E6的判断方式可以通过比较并交换(英文全称:CompareAndSwap,英文简称:CAS)策略来完成,使用该CAS策略后,不需要对进程加锁,因此可以实现无锁的value数据写入。具体的,设置CAS(memShm[index],old_value,new_value),其中,memShm[index]表示进程地址空间中存储的第一数组单元的value,old_value表示步骤E1中读取到的value,new_value可以表示步骤E4中计算出的更新后value。当CAS冲突时,进行重试多次步骤E1至E4。
通过以上实施例对本发明实施例的描述可知,在本发明实施例中,首先服务器获取数据读写指令,数据读写指令包括:用于读写操作处理的第一key,然后服务器根据第一key从该服务器本地的进程地址空间中定位出第一key对应的第一值value在第一数组单元中的存储位置,进程地址空间包括:通过bitmap方式存储有value的连续多个数组单元,第一数组单元为进程地址空间中的一个数组单元,最后服务器根据存储位置从第一数组单元中确定出第一value,并按照数据读写指令对确定出的第一value进行读写操作处理。由于本发明实施例中服务器在该服务器本地设置有进程地址空间,因此服务器接收到数据读写指令后只需要根据第一key来从本地的进程地址空间中就可以获取到第一value,本发明实施例完全可以解除数据存储对外部存储服务的依赖,服务器可以实现独立的单机读写数据,从而降低网络流量,减少数据读取时延,保证数据处理的可靠性。
为便于更好的理解和实施本发明实施例的上述方案,下面举例相应的应用场景来进行具体说明。
本发明实施例提供的数据的处理方法可以应用于计算机技术与互联网存储中对数据的高效存储处理,实现基于服务器的本机共享内存的无锁读写bitmap存储,解决现有技术中通过网络通信存储数据时导致的延时高,并发量低等缺点。本发明实施例中服务器完全可以解除对外部存储服务的依赖,让服务器可以独立单机读写数据,从而降低网络流量,按需分配内存,降低内存使用率。另外,无锁读写存储,还可以提高单机的数据存储并发量。本发明实施例中服务器可以通过主程序调用具体的bitmap组件来完成数据的存储处理。本发明实施例中所述的无锁指的是多进程对同一个数据读写操作,不需要进行加锁同步。
请参阅图2所示,为本发明实施例中服务器中基于bitmap组件和多个进程交互的示意图。本发明实施例可以在服务器配置bitmap组件,bitmap组件中通过应用程序编程接口(英文全称:Application Programming Interface,英文简称:API)和多个进程(例如进程1、进程2、…、进程n)进行本地通信,bitmap组件中提供一个服务器创建的共享内存,通过该共享内存映射到的进程地址空间来存储value。bitmap组件是一个提供简单初始化和读写接口的程序。服务器的主程序在运行时通过接口规范对bitmap组件进行调用,用来实现服务器本机的高效存储的功能。应用程序可以分两步来调用该bitmap组件:1,进程初始化。2,读写value数据。在服务器的主程序启动的时候,首先会判断共享内存是否已经创建,如果没有则创建共享内存,并附加到进程地址空间,例如将共享内存映射到一片连续的进程地址空间,各个进程就可以实时对存储数据进行操作。举例说明,服务器的主程序启动的时候,调用bitmap组件提供的API创建共享内存,在Linux系统只有将共享的内存附加到程序进程的地址空间,才能被各个进程访问,进行读写处理操作。
接下来对本发明实施例中进程地址空间中存储数据进行详细说明。bitmap组件提供key-value存储功能,即bitmap组件按照key-value方式进行数据读写。在服务器的主程序启动的时候根据业务需求分配足够的共享内存容量,具体需要的内存根据不同的业务场景,事先进行评估计算得出。并根据value的最大值来决定单个key对应的value占用的最大bit个数,从而有效的降低内存的使用量,提高程序性能,降低服务成本。并提供无锁的读写接口,供业务程序对该存储进行读写操作。本发明实施例中value数据在进程地址空间中的调用是无锁的,在bitmap组件实现的时候,多进程在更新多一片内存时不采用进程锁,例如采用CAS技术实现的无锁操作,具体的,可以提供的api为sync_bool_compare_and_swap来完成。
在本发明实施例的进程地址空间中,bitmap组件通过n bit位方式来存储value,有效的减少内存使用量。其中n和value之间的关系可以如下:2n>=Max(value)+1。为了让程序有更高的执行效率,n可以满足如下条件:n=1,2或者4,或者n=8*m,1<=m<=4的整数。本发明实施例中可以巧妙的利用操作系统对二进制操作的方法来提高效率,从而需要对n进行限制,一是方便程序逻辑实现。二是因为单字节是8bit组成。那么当n=8*m时,那么就只需要对完整的各个字节进行处理,降低算法复杂度,提供程序运行效率。
举例说明,请参阅图3所示,为本发明实施例提供的数组单元的实现方式示意图,如value的最大值为3,则n为2。为了更加简明对bitmap组件实现原理进行说明,后面的描述都以n为2,value为3为例。存储一个元素占用2bit,则4个元素占用1bytes,4bytes等价于系统的无符号整型int32_t,uint32_t是程序的一种数据类型,占用4个字节。。具体的bitmap数据存储结构如图2,bitmap存储空间在进程中表现为无符号char型数组。
本发明实施例提供高效的数据读取和写入操作,将复杂的数据定位和更新操作进行封装,对外提供一个简单接口。该bitmap组件适用于任何高并发的,对内存要求较高,key-value存储的应用场景,具有使用简单,成本较低的优点。需要说明的是,本发明实施例中数组单元中存储的单个value的最大值可以结合应用场景来确定,本发明实施例中不对value最大值进行限制,通常情况下,32bit表示的数据大小基本上可以表示所有常见的业务场景。本发明实施例中,bitmap组件中采用空间换取时间的算法优化方式,预先对需要的相应bit位值进行计算,进行统一存储,在程序运行过程中,只需根据具体key计算存储下标即可。
接下来对本发明实施例中数据存储空间定位进行举例说明,请参阅图4所示,为本发明实施例提供的数组单元中存储value的实现方式示意图,由于读写数据都需要首先对key对应的存储空间进行高效的定位,才能对value进行操作。所以下面对基于key对应的vlaue的位置寻址算法进行分析:
1,bitmap存储在进程地址空间中包括有多个连续的数组单元,存储元素数量个数为size。则表示为unsigned char memShm[size],key为键,value是需要设置的值。
2,设键key在数组memShm的索引值(也称为下标)为index。由于4个元素占用一个字节,则index=key>>2,其中,符号>>表示向右移位,将key右移动2位后产生的值,即是需要的index值。
3,设对应value在一个字节中向右的位置偏移量为2*index_pos,其中,图4中以单个value占用的最大bit个数为2进行说明,则位置偏移量可以为2*index_pos,则index_pos=key&Max(value),或者index_pos=key%(Max(value)+1),其中,&表示位与操作,%表示求余操作,图4中以Max(value)为3为例,则index_pos=key&3,等价于index_pos=key%4。
具体的寻址过程如图4所示,在经过上面寻址算法定位到键key对应的value值在数组memShm中的空间地址,由key在数组中的下标index(index>=0)和单字节中的偏移量2*index_pos(0<=index_pos<=X)表示。
其中,n、m的含义见前述举例。
定位出value在数组memShm中的存储位置之后,可以通过读写接口再对对应的存储空间进行操作。
接下来对本发明实施例中数据读算法的实现过程进行举例说明。采用上面的数据定位后,即可读取对应的value值。具体原理为:
1、获取index下标对应的值,即单字节长度的值uchar_value=memShm[index]。
2、对uchar_value字节内偏移量2*index_pos的2bit保持不变,其他6bit置为0,如图5所示,为本发明实施例中为数组单元中的value取值进行置位操作的示意图。图5中,只有uchar_value字节内偏移量2*index_pos开始的2个bit内需要读取的value,将整个uchar_value定义为tmp_value。
3、再将tmp_value进行右移位,转换为普通的10进制数据。假设位置偏移量用bit_mov来表示,则存在如下公式:
其中,n、m、index_pos的含义见前述实施例中的说明。
例如,在6所示的举例中,需要右移动的位数bit_mov=(3-index_pos)*2。
4、读取出value,即value=(tmp_value>>bit_mov),如图6所示,为本发明实施例中对数组单元中的value取值进行偏移操作的示意图。
本发明实施例中,在实现中对数据的bit位进行置0操作,首先事先计算向右的位置偏移量2*index_pos位开始的2bit为1,其他bit位为0对应的单字节值,并对其采用数组存储。然后程序在运行中通过index_pos值对数组进行下标访问的方式获取,其中,置0操作是把bit位对应的值都设置为0。可以理解的是,在执行数据的置位操作前,还可以根据需要对参数数据的有效性进行校验。
设以向右的位置偏移量2*index_pos位开始的2bit为1,其他bit位为0的数值为bits_in_byte,则bits_in_byte=3<<((3-index_pos)*2)。这里需要将3转成uin8_t类型,符号<<表示向左移位,得到的bits_in_byte的表达式如下:
所以当index_pos依次为0,1,2,3时对应的bits_in_byte值分别为:192,48,12,3。
其中,数据读取伪代码可以按照如下代码实现:
const static uint32_t bitsinbyte3[4]={192,48,12,3};
value=(uint8_t)(memShm[index])&(bitsinbyte3[index_pos]);
uint8_t bit_mov=(3-index_pos)<<1;
value=(value>>bit_mov);
接下来对本发明实施例中数据写算法的实现过程进行举例说明。写key对应的value值首先也是采用定位算法,找到key对应的index以及index_pos值,然后数据写操作。原理如下:
1,获取index下标对应的值,即单字节长度的值old_value=memShm[index]。
2,设置old_value_1=old_value,则对old_value_1字节内偏移量index_pos的2bit置为0,其余6个比特取值保持不变。
3,将需要被设置的值(即需要写入到数组中的值)value左移动位数(3-index_pos)*2,得到value*,value*=value<<((3-index_pos)*2)。
4,index对应下标需要重新设置的值为new_value=(old_value_1|value),其中,“|”表示按位取或操作。
5,采用无锁的CAS策略,对index下标的值进行设置。具体方式为CAS(memShm[index],old_value,new_value),当CAS冲突时,进行重试多次。在Linux操作系统的具体实现由__sync_bool_compare_and_swap提供。其中,以CAS(A,B,C)运算为例,CAS的具体含义:当A地址的值与B相等,则将A地址的值修改为C。如果A地址的值与B不相等,则表示冲突。为了保证程序的高可用性,当有冲突发生时,就采用重试的方式。由于单次冲突概率就非常低,那么多次重试概率就可以降低到接近0。所以这里是在实际运用中,一般设置重试次数为3(3表示经验值,可以结合应用场景来灵活选取)。
与读数据操作一样,在bitmap组件实现中,同样对需要进行位操作的数据事先计算,采用数组结构存储,然后通过下标访问的方式进行优化。写数据伪代码如下:
通过前述对本发明的举例说明可知,本发明实施例中采用节约内存的bit数据存储方式,以及对应key的寻址方式。本发明实施例中采用key-value数据读写方法通过事先计算,数组存储对应值,下标方式寻址代替实时计算数据的方法。本发明实施例中采用多进程原子操作方法,采用CAS操作,提高并发量,降低锁冲突的方法。计算机的原子操作定义是不可被中断的,进而保证数据的一致性。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
为便于更好的实施本发明实施例的上述方案,下面还提供用于实施上述方案的相关装置。
请参阅图7-a所示,本发明实施例提供的一种服务器700,可以包括:指令获取模块701、存储位置定位模块702和数据处理模块703,其中,
指令获取模块701,用于获取数据读写指令,所述数据读写指令包括:用于读写操作处理的第一键;
存储位置定位模块702,用于根据所述第一键从该服务器本地的进程地址空间中定位出所述第一键对应的第一值在第一数组单元中的存储位置,所述进程地址空间包括:通过位图bitmap方式存储有值的连续多个数组单元,所述第一数组单元为所述进程地址空间中的一个数组单元;
数据处理模块703,用于根据所述存储位置从所述第一数组单元中确定出所述第一值,并按照所述数据读写指令对确定出的所述第一值进行读写操作处理。
在本发明的一些实施例中,请参阅图7-b所示,所述服务器700还包括:
共享内存创建模块704,用于在所述服务器的本地内存中创建共享内存;
地址空间映射模块705,用于将创建的所述共享内存映射到该服务器本地的进程地址空间中。
在本发明的一些实施例中,请参阅图7-c所示,所述服务器700,还包括:
配置模块706,用于根据需要存储的多个值中的最大值确定所述进程地址空间中的数组单元的容量和所述多个值中每个值占用的最大比特个数。
在本发明的一些实施例中,请参阅图7-d所示,所述存储位置定位模块702,包括:
数组单元定位模块7021,用于根据所述第一键从所述进程地址空间中确定出第一数组单元,所述第一数组单元的索引值通过对所述第一键的取值按照所述第一值占用的最大比特个数进行偏移后得到;
偏移量确定模块7022,用于根据所述第一值占用的最大比特个数和所述第一键的取值确定所述第一值在所述第一数组单元中存储时使用的位置偏移量;
空间地址定位模块7023,用于从所述第一数组单元的索引值开始,按照所述位置偏移量在所述第一数组单元中进行偏移操作,则完成上述偏移操作后所指向的空间地址即为所述第一值在所述第一数组单元中的存储位置。
在本发明的一些实施例中,请参阅图7-e所示,所述数据处理模块703,包括:
第一数据读出模块7031,用于当所述数据读写指令具体为数据读取指令时,将所述第一数组单元中存储的值从所述进程地址空间中读取出;
第一数据加工模块7032,用于将所述第一数组单元中从完成上述偏移操作后所指向的空间地址开始,长度为所述最大比特个数的存储空间内存储的值的取值保持不变,将所述第一数组单元中除从所述空间地址开始,长度为所述最大比特个数的存储空间以外的其它存储空间中存储的值置为0,得到所述第一数组单元中存储的临时值;
数据移位输出模块7033,用于按照所述位置偏移量在所述第一数组单元中对所述临时值进行偏移操作,并读取出所述第一数组单元中完成偏移操作后得到的值,该读取出的值即为所述第一值。
在本发明的一些实施例中,请参阅图7-f所示,所述数据处理模块700,包括:
第二数据读出模块7034,用于当所述数据读写指令具体为数据写入指令时,将所述第一数组单元中存储的值从所述进程地址空间中读取出,所述数据写入指令还包括:与所述第一键对应的需要写入到所述进程地址空间的第二值;
第二数据加工模块7035,用于将所述第一数组单元中从完成上述偏移操作后所指向的空间地址开始,长度为所述最大比特个数的存储空间内存储的值的取值置为0,将所述第一数组单元中除从所述空间地址开始长度为所述最大比特个数的存储空间以外的其它存储空间中存储的值保持不变,得到所述第一数组单元中存储的更新前值;
数据移位模块7036,用于将所述数据写入指令中携带的第二值按照所述位置偏移量进行偏移操作,得到完成偏移后的第二值;
数据运算模块7037,用于对所述更新前值和所述第二值进行按位取或操作,得到所述第一数组单元中存储的更新后值;
数据更新模块7038,用于将存储所述更新后值的第一数组单元替换掉所述进程地址空间中存储的第一数组单元。
进一步的,在本发明的另一些实施例中,请参阅图7-g所示,相对于图7-d所示,所述数据处理模块700,还包括:
数据判断模块7039,用于所述数据运算模块7037得到所述第一数组单元中存储的更新后值之后,判断所述进程地址空间中的所述第一数组单元中存储的值与所述第二读出模块从所述进程地址空间中读取出的值是否相同;
触发模块7030,用于当所述进程地址空间中的所述第一数组单元中存储的值与所述第二读出模块从所述进程地址空间中读取出的值相同时,触发执行所述数据更新模块7038;当所述进程地址空间中的所述第一数组单元中存储的值与所述第二读出模块从所述进程地址空间中读取出的值不相同时,触发所述第二数据读出模块7034重新读取出从所述进程地址空间中读取出所述第一数组单元中存储的值,并由所述数据运算模块7037重新获取所述第一数组单元中存储的更新后值。
通过以上实施例对本发明实施例的描述可知,在本发明实施例中,首先服务器获取数据读写指令,数据读写指令包括:用于读写操作处理的第一键,然后服务器根据第一键从该服务器本地的进程地址空间中定位出第一键对应的第一值在第一数组单元中的存储位置,进程地址空间包括:通过bitmap方式存储有值的连续多个数组单元,第一数组单元为进程地址空间中的一个数组单元,最后服务器根据存储位置从第一数组单元中确定出第一值,并按照数据读写指令对确定出的第一值进行读写操作处理。由于本发明实施例中服务器在该服务器本地设置有进程地址空间,因此服务器接收到数据读写指令后只需要根据第一键来从本地的进程地址空间中就可以获取到第一值,本发明实施例完全可以解除数据存储对外部存储服务的依赖,服务器可以实现独立的单机读写数据,从而降低网络流量,减少数据读取时延,保证数据处理的可靠性。
图8是本发明实施例提供的一种服务器结构示意图,该服务器1100可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上中央处理器(central processingunits,CPU)1122(例如,一个或一个以上处理器)、存储器1132和bitmap组件1133,一个或一个以上存储应用程序1142或数据1144的存储介质1130(例如一个或一个以上海量存储设备)。其中,存储器1132和存储介质1130可以是短暂存储或持久存储。存储在存储介质1130的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对服务器中的一系列指令操作。更进一步地,中央处理器1122可以设置为与存储介质1130通信,在服务器1100上执行存储介质1130中的一系列指令操作,该存储介质1130具体为服务器的本地内存。bitmap组件1133详见前述实施例中的举例说明。
服务器1100还可以包括一个或一个以上电源1126,一个或一个以上有线或无线网络接口1150,一个或一个以上输入输出接口1158,和/或,一个或一个以上操作系统1141,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM等等。
上述实施例中由服务器所执行的数据的处理方法步骤可以基于该图8所示的服务器结构。
另外需说明的是,以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。另外,本发明提供的装置实施例附图中,模块之间的连接关系表示它们之间具有通信连接,具体可以实现为一条或多条通信总线或信号线。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件的方式来实现,当然也可以通过专用硬件包括专用集成电路、专用CPU、专用存储器、专用元器件等来实现。一般情况下,凡由计算机程序完成的功能都可以很容易地用相应的硬件来实现,而且,用来实现同一功能的具体硬件结构也可以是多种多样的,例如模拟电路、数字电路或专用电路等。但是,对本发明而言更多情况下软件程序实现是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在可读取的存储介质中,如计算机的软盘,U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
综上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照上述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对上述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (14)
1.一种数据的处理方法,其特征在于,包括:
服务器获取数据读写指令,所述数据读写指令包括:用于读写操作处理的第一键;
所述服务器根据所述第一键从该服务器本地的进程地址空间中定位出所述第一键对应的第一值在第一数组单元中的存储位置,所述进程地址空间包括:通过位图bitmap方式存储有值的连续多个数组单元,所述第一数组单元为所述进程地址空间中的一个数组单元;
所述服务器根据所述存储位置从所述第一数组单元中确定出所述第一值,并按照所述数据读写指令对确定出的所述第一值进行读写操作处理。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
所述服务器在所述服务器的本地内存中创建共享内存;
所述服务器将创建的所述共享内存映射到该服务器本地的进程地址空间中。
3.根据权利要求1所述的方法,其特征在于,所述方法还包括:
所述服务器根据需要存储的多个值中的最大值确定所述进程地址空间中的数组单元的容量和所述多个值中每个值占用的最大比特个数。
4.根据权利要求1所述的方法,其特征在于,所述服务器根据所述第一键从该服务器本地的进程地址空间中定位出所述第一键对应的第一值在第一数组单元中的存储位置,包括:
所述服务器根据所述第一键从所述进程地址空间中确定出第一数组单元,所述第一数组单元的索引值通过对所述第一键的取值按照所述第一值占用的最大比特个数进行偏移后得到;
所述服务器根据所述第一值占用的最大比特个数和所述第一键的取值确定所述第一值在所述第一数组单元中存储时使用的位置偏移量;
所述服务器从所述第一数组单元的索引值开始,按照所述位置偏移量在所述第一数组单元中进行偏移操作,则完成上述偏移操作后所指向的空间地址即为所述第一值在所述第一数组单元中的存储位置。
5.根据权利要求4所述的方法,其特征在于,所述服务器根据所述存储位置从所述第一数组单元中确定出所述第一值,并按照所述数据读写指令对确定出的所述第一值进行读写操作处理,包括:
当所述数据读写指令具体为数据读取指令时,所述服务器将所述第一数组单元中存储的值从所述进程地址空间中读取出;
所述服务器将所述第一数组单元中从完成上述偏移操作后所指向的空间地址开始,长度为所述最大比特个数的存储空间内存储的值的取值保持不变,将所述第一数组单元中除从所述空间地址开始长度为所述最大比特个数的存储空间以外的其它存储空间中存储的值置为0,得到所述第一数组单元中存储的临时值;
所述服务器按照所述位置偏移量在所述第一数组单元中对所述临时值进行偏移操作,并读取出所述第一数组单元中完成偏移操作后得到的值,该读取出的值即为所述第一值。
6.根据权利要求4所述的方法,其特征在于,所述服务器根据所述存储位置从所述第一数组单元中确定出所述第一值,并按照所述数据读写指令对确定出的所述第一值进行读写操作处理,包括:
当所述数据读写指令具体为数据写入指令时,所述服务器将所述第一数组单元中存储的值从所述进程地址空间中读取出,所述数据写入指令还包括:与所述第一键对应的需要写入到所述进程地址空间的第二值;
所述服务器将所述第一数组单元中从完成上述偏移操作后所指向的空间地址开始,长度为所述最大比特个数的存储空间内存储的值的取值置为0,将所述第一数组单元中除从所述空间地址开始长度为所述最大比特个数的存储空间以外的其它存储空间中存储的值保持不变,得到所述第一数组单元中存储的更新前值;
所述服务器将所述数据写入指令中携带的第二值按照所述位置偏移量进行偏移操作,得到完成偏移后的第二值;
所述服务器对所述更新前值和所述完成偏移后的第二值进行按位取或操作,得到所述第一数组单元中存储的更新后值;
所述服务器将存储所述更新后值的第一数组单元替换掉所述进程地址空间中存储的第一数组单元。
7.根据权利要求6所述的方法,其特征在于,所述服务器根据所述存储位置从所述第一数组单元中确定出所述第一值,并按照所述数据读写指令对确定出的所述第一值进行读写操作处理,还包括:
所述服务器得到所述第一数组单元中存储的更新后值之后,所述服务器判断所述进程地址空间中的所述第一数组单元中存储的值与所述服务器从所述进程地址空间中读取出的值是否相同;
当所述进程地址空间中的所述第一数组单元中存储的值与所述服务器从所述进程地址空间中读取出的值相同时,触发执行如下步骤:所述服务器将存储所述更新后值的第一数组单元替换掉所述进程地址空间中存储的第一数组单元;
当所述进程地址空间中的所述第一数组单元中存储的值与所述服务器从所述进程地址空间中读取出的值不相同时,重新读取出所述进程地址空间的所述第一数组单元中存储的值,并重新获取所述第一数组单元中存储的更新后值。
8.一种服务器,其特征在于,包括:
指令获取模块,用于获取数据读写指令,所述数据读写指令包括:用于读写操作处理的第一键;
存储位置定位模块,用于根据所述第一键从该服务器本地的进程地址空间中定位出所述第一键对应的第一值在第一数组单元中的存储位置,所述进程地址空间包括:通过位图bitmap方式存储有值的连续多个数组单元,所述第一数组单元为所述进程地址空间中的一个数组单元;
数据处理模块,用于根据所述存储位置从所述第一数组单元中确定出所述第一值,并按照所述数据读写指令对确定出的所述第一值进行读写操作处理。
9.根据权利要求8所述的服务器,其特征在于,所述服务器还包括:
共享内存创建模块,用于在所述服务器的本地内存中创建共享内存;
地址空间映射模块,用于将创建的所述共享内存映射到该服务器本地的进程地址空间中。
10.根据权利要求8所述的服务器,其特征在于,所述服务器,还包括:
配置模块,用于根据需要存储的多个值中的最大值确定所述进程地址空间中的数组单元的容量和所述多个值中每个值占用的最大比特个数。
11.根据权利要求8所述的服务器,其特征在于,所述存储位置定位模块,包括:
数组单元定位模块,用于根据所述第一键从所述进程地址空间中确定出第一数组单元,所述第一数组单元的索引值通过对所述第一键的取值按照所述第一值占用的最大比特个数进行偏移后得到;
偏移量确定模块,用于根据所述第一值占用的最大比特个数和所述第一键的取值确定所述第一值在所述第一数组单元中存储时使用的位置偏移量;
空间地址定位模块,用于从所述第一数组单元的索引值开始,按照所述位置偏移量在所述第一数组单元中进行偏移操作,则完成上述偏移操作后所指向的空间地址即为所述第一值在所述第一数组单元中的存储位置。
12.根据权利要求11所述的服务器,其特征在于,所述数据处理模块,包括:
第一数据读出模块,用于当所述数据读写指令具体为数据读取指令时,将所述第一数组单元中存储的值从所述进程地址空间中读取出;
第一数据加工模块,用于将所述第一数组单元中从完成上述偏移操作后所指向的空间地址开始,长度为所述最大比特个数的存储空间内存储的值的取值保持不变,将所述第一数组单元中除从所述空间地址开始,长度为所述最大比特个数的存储空间以外的其它存储空间中存储的值置为0,得到所述第一数组单元中存储的临时值;
数据移位输出模块,用于按照所述位置偏移量在所述第一数组单元中对所述临时值进行偏移操作,并读取出所述第一数组单元中完成偏移操作后得到的值,该读取出的值即为所述第一值。
13.根据权利要求11所述的服务器,其特征在于,所述数据处理模块,包括:
第二数据读出模块,用于当所述数据读写指令具体为数据写入指令时,将所述第一数组单元中存储的值从所述进程地址空间中读取出,所述数据写入指令还包括:与所述第一键对应的需要写入到所述进程地址空间的第二值;
第二数据加工模块,用于将所述第一数组单元中从完成上述偏移操作后所指向的空间地址开始,长度为所述最大比特个数的存储空间内存储的值的取值置为0,将所述第一数组单元中除从所述空间地址开始长度为所述最大比特个数的存储空间以外的其它存储空间中存储的值保持不变,得到所述第一数组单元中存储的更新前值;
数据移位模块,用于将所述数据写入指令中携带的第二值按照所述位置偏移量进行偏移操作,得到完成偏移后的第二值;
数据运算模块,用于对所述更新前值和所述第二值进行按位取或操作,得到所述第一数组单元中存储的更新后值;
数据更新模块,用于将存储所述更新后值的第一数组单元替换掉所述进程地址空间中存储的第一数组单元。
14.根据权利要求13所述的服务器,其特征在于,所述数据处理模块,还包括:
数据判断模块,用于所述数据运算模块得到所述第一数组单元中存储的更新后值之后,判断所述进程地址空间中的所述第一数组单元中存储的值与所述第二读出模块从所述进程地址空间中读取出的值是否相同;
触发模块,用于当所述进程地址空间中的所述第一数组单元中存储的值与所述第二读出模块从所述进程地址空间中读取出的值相同时,触发执行所述数据更新模块;当所述进程地址空间中的所述第一数组单元中存储的值与所述第二读出模块从所述进程地址空间中读取出的值不相同时,触发所述第二数据读出模块重新读取出从所述进程地址空间中读取出所述第一数组单元中存储的值,并由所述数据运算模块重新获取所述第一数组单元中存储的更新后值。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610381737.1A CN107451070B (zh) | 2016-06-01 | 2016-06-01 | 一种数据的处理方法和服务器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610381737.1A CN107451070B (zh) | 2016-06-01 | 2016-06-01 | 一种数据的处理方法和服务器 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107451070A true CN107451070A (zh) | 2017-12-08 |
CN107451070B CN107451070B (zh) | 2020-08-04 |
Family
ID=60485238
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610381737.1A Active CN107451070B (zh) | 2016-06-01 | 2016-06-01 | 一种数据的处理方法和服务器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107451070B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109408450A (zh) * | 2018-09-27 | 2019-03-01 | 中兴飞流信息科技有限公司 | 一种数据处理的方法、系统、协处理装置和主处理装置 |
CN111046074A (zh) * | 2019-12-13 | 2020-04-21 | 北京百度网讯科技有限公司 | 流式数据处理方法、装置、设备和介质 |
CN111399759A (zh) * | 2019-11-07 | 2020-07-10 | 杭州海康威视系统技术有限公司 | 读数据、写数据的方法、以及对象文件系统 |
CN112612803A (zh) * | 2020-12-22 | 2021-04-06 | 浙江大学 | 基于持久性内存的键值对存储系统及数据并发插入方法 |
Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1263306A (zh) * | 1999-02-05 | 2000-08-16 | Arm有限公司 | 在数据处理系统内的位图字形数据存储 |
CN1949217A (zh) * | 2005-10-13 | 2007-04-18 | 国际商业机器公司 | 用于将信息存储在通用信息存储中的系统和方法 |
US20070156984A1 (en) * | 2006-01-05 | 2007-07-05 | Hitachi, Ltd. | Snapshot format conversion method and apparatus |
CN101814044A (zh) * | 2010-04-19 | 2010-08-25 | 中兴通讯股份有限公司 | 元数据处理方法及装置 |
CN103634277A (zh) * | 2012-08-23 | 2014-03-12 | 深圳市腾讯计算机系统有限公司 | 一种共享内存的方法、服务器及系统 |
CN103699497A (zh) * | 2013-12-19 | 2014-04-02 | 京信通信系统(中国)有限公司 | 一种缓存分配方法及装置 |
CN104079600A (zh) * | 2013-03-27 | 2014-10-01 | 中兴通讯股份有限公司 | 文件存储方法、装置、访问客户端及元数据服务器系统 |
CN105190574A (zh) * | 2013-03-15 | 2015-12-23 | 赛门铁克公司 | 在共享存储环境中提供本地高速缓存一致性 |
CN105183374A (zh) * | 2015-08-28 | 2015-12-23 | 北京腾凌科技有限公司 | 一种数据读写方法以及主板 |
CN105512053A (zh) * | 2015-12-07 | 2016-04-20 | 中南大学 | 移动透明计算系统服务器端多用户访问的镜像缓存方法 |
-
2016
- 2016-06-01 CN CN201610381737.1A patent/CN107451070B/zh active Active
Patent Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1263306A (zh) * | 1999-02-05 | 2000-08-16 | Arm有限公司 | 在数据处理系统内的位图字形数据存储 |
CN1949217A (zh) * | 2005-10-13 | 2007-04-18 | 国际商业机器公司 | 用于将信息存储在通用信息存储中的系统和方法 |
US20070156984A1 (en) * | 2006-01-05 | 2007-07-05 | Hitachi, Ltd. | Snapshot format conversion method and apparatus |
CN101814044A (zh) * | 2010-04-19 | 2010-08-25 | 中兴通讯股份有限公司 | 元数据处理方法及装置 |
CN103634277A (zh) * | 2012-08-23 | 2014-03-12 | 深圳市腾讯计算机系统有限公司 | 一种共享内存的方法、服务器及系统 |
CN105190574A (zh) * | 2013-03-15 | 2015-12-23 | 赛门铁克公司 | 在共享存储环境中提供本地高速缓存一致性 |
CN104079600A (zh) * | 2013-03-27 | 2014-10-01 | 中兴通讯股份有限公司 | 文件存储方法、装置、访问客户端及元数据服务器系统 |
CN103699497A (zh) * | 2013-12-19 | 2014-04-02 | 京信通信系统(中国)有限公司 | 一种缓存分配方法及装置 |
CN105183374A (zh) * | 2015-08-28 | 2015-12-23 | 北京腾凌科技有限公司 | 一种数据读写方法以及主板 |
CN105512053A (zh) * | 2015-12-07 | 2016-04-20 | 中南大学 | 移动透明计算系统服务器端多用户访问的镜像缓存方法 |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109408450A (zh) * | 2018-09-27 | 2019-03-01 | 中兴飞流信息科技有限公司 | 一种数据处理的方法、系统、协处理装置和主处理装置 |
CN109408450B (zh) * | 2018-09-27 | 2021-03-30 | 中兴飞流信息科技有限公司 | 一种数据处理的方法、系统、协处理装置和主处理装置 |
CN111399759A (zh) * | 2019-11-07 | 2020-07-10 | 杭州海康威视系统技术有限公司 | 读数据、写数据的方法、以及对象文件系统 |
CN111399759B (zh) * | 2019-11-07 | 2023-02-10 | 杭州海康威视系统技术有限公司 | 读数据、写数据的方法、以及对象文件系统 |
CN111046074A (zh) * | 2019-12-13 | 2020-04-21 | 北京百度网讯科技有限公司 | 流式数据处理方法、装置、设备和介质 |
CN111046074B (zh) * | 2019-12-13 | 2023-09-01 | 北京百度网讯科技有限公司 | 流式数据处理方法、装置、设备和介质 |
CN112612803A (zh) * | 2020-12-22 | 2021-04-06 | 浙江大学 | 基于持久性内存的键值对存储系统及数据并发插入方法 |
CN112612803B (zh) * | 2020-12-22 | 2022-07-12 | 浙江大学 | 基于持久性内存的键值对存储系统及数据并发插入方法 |
Also Published As
Publication number | Publication date |
---|---|
CN107451070B (zh) | 2020-08-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103262058B (zh) | 利用simd进行冲突检测的方法、装置和系统 | |
KR102028252B1 (ko) | 자율 메모리 아키텍처 | |
CN105117355A (zh) | 存储器、存储器系统及其数据处理方法 | |
US7873763B2 (en) | Multi-reader multi-writer circular buffer memory | |
CN101061460B (zh) | 用于混移运算的微处理器设备和方法 | |
CN107451070A (zh) | 一种数据的处理方法和服务器 | |
CN100383792C (zh) | 缓存数据库数据组织方法 | |
CN113220685B (zh) | 智能合约存储内容的遍历方法及装置、电子设备 | |
CN113313247B (zh) | 基于数据流架构的稀疏神经网络的运算方法 | |
CN111666330A (zh) | 数据的读写方法和装置 | |
CN108733324A (zh) | 一种固态硬盘的数据读写方法、装置、设备及存储介质 | |
CN101847096A (zh) | 包含栈变量函数的优化方法 | |
CN105094691A (zh) | 一种数据操作的方法、设备和系统 | |
CN112988761A (zh) | 区块链数据存储方法及装置、电子设备 | |
CN100334582C (zh) | 在手持装置中存储和检索数据的方法及装置 | |
CN114706848A (zh) | 区块链数据存储、更新、读取方法及装置、电子设备 | |
CN111061652B (zh) | 一种基于mpi-io中间件的非易失内存管理方法与系统 | |
CN112905607B (zh) | 区块链数据存储方法及装置、电子设备 | |
CN112035380B (zh) | 一种数据处理方法、装置、设备及可读存储介质 | |
CN115221176A (zh) | 区块链数据存储方法及装置、电子设备 | |
WO2022057459A1 (zh) | 一种基于Tensorcore处理int4数据类型的方法、系统、设备及介质 | |
CN109471702A (zh) | 一种虚拟机的管理方法和装置 | |
CN106293491A (zh) | 写请求的处理方法和内存控制器 | |
CN114816509A (zh) | 区块链版本兼容性验证方法及装置、电子设备 | |
CN110716923B (zh) | 数据处理方法、装置、节点设备及存储介质 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |