用于数据库的多线程数据处理方法、装置和电子设备与流程

文档序号:29935917发布日期:2022-05-07 13:35阅读:59来源:国知局
1.本发明实施例涉及计算机
技术领域
:,尤其涉及一种用于数据库的多线程数据处理方法、装置和电子设备。
背景技术
::2.数据库可以理解为按照数据结构来组织、存储和管理数据的仓库,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。3.在数据库技术中,目前主要有两种方法来使用大量的内存。一种是在传统的数据库中,增大缓冲池,将一个事务所涉及的数据都放在缓冲池中,组织成相应的数据结构来进行查询和更新处理,也就是常说的共享内存技术,这种方法优化的主要目标是最小化磁盘访问;另一种就是内存数据库(mmdb:mainmemorydatabase,也叫主存数据库)技术,相当于重新设计一种数据库管理系统,对查询处理、并发控制与恢复的算法和数据结构进行重新设计,以更有效地使用cpu周期和内存,这种技术近乎把整个数据库放进内存中,因而会产生一些根本性的变化。例如,redis(remotedictionaryserver,远程字典服务)就是一种内存型数据库,其提供了10w/s级别的qps(querypersecond,每秒查询率)访问能力,因此被广泛应用。4.然而,如redis这样的内存型数据库,其性能的发挥多被其现有的线程机制限制,譬如,早期redis6.0之前的版本是单线程实现,无法利用服务器多核的特性;而redis6.0引入了多线程机制io-threads,性能得到很大提升。加入多线程会引入对于共享数据的同步需求,而redis6.0的很多命令是基于单线程实现而具备原子语义的。为了命令兼容和实现复杂度的考虑,redis6.0的io-threads只负责网络io和协议的解析工作,真正的数据的操作都是交给一个特殊的线程(或者叫做主线程)来处理的,即读、写相关的命令都由这一个特殊的线程来处理,这限制了redis6.0的处理能力,特别是读命令的处理能力,进而其整体性能也受到了限制。技术实现要素:5.鉴于此,为解决上述的技术问题,本发明实施例提供一种用于数据库的多线程数据处理方法、装置和电子设备。6.第一方面,本发明实施例提供一种用于数据库的多线程数据处理方法,所述数据库包括至少一个主线程、两个或两个以上读线程以及一个写线程,且所述数据库中存储数据的数据结构满足读-拷贝修改rcu同步机制,所述方法包括:7.通过所述主线程接收来自客户端的多个数据库访问请求,所述数据库访问请求中包括数据库网络协议,将多个所述数据库访问请求分别发送至一个读线程;8.针对任一所述数据库访问请求,通过目标读线程解析所述数据库访问请求中的所述数据库网络协议,以确定所述数据库访问请求的类型,所述目标读线程为接收到所述数据库访问请求的读线程;9.在多个所述数据库访问请求的类型包括读请求和写请求,且所述读请求和写请求针对所述数据库中同一存储数据的情况下,针对类型为写请求的数据库访问请求,通过其对应的目标读线程,将所述数据库访问请求发送至所述写线程;通过所述写线程按照rcu同步机制对所述存储数据执行写操作;10.针对类型为读请求的所述数据库访问请求,通过其对应的目标读线程按照rcu同步机制对所述存储数据执行读操作。11.第二方面,本发明实施例提供一种用于数据库的多线程数据处理装置,所述数据库包括至少一个主线程、两个或两个以上读线程以及一个写线程,且所述数据库中存储数据的数据结构满足rcu同步机制,所述装置包括:12.客户端连接模块,用于通过所述主线程接收来自客户端的多个数据库访问请求,所述数据库访问请求中包括数据库网络协议,将多个所述数据库访问请求分别发送至一个读线程;13.请求解析模块,用于针对任一所述数据库访问请求,通过目标读线程解析所述数据库访问请求中的所述数据库网络协议,以确定所述数据库访问请求的类型,所述目标读线程为接收到所述数据库访问请求的读线程;14.写请求发送模块,用于在多个所述数据库访问请求的类型包括读请求和写请求,且所述读请求和写请求针对所述数据库中同一存储数据的情况下,针对类型为写请求的数据库访问请求,通过其对应的目标读线程,将所述数据库访问请求发送至所述写线程;15.写请求执行模块,用于通过所述写线程按照rcu同步机制对所述存储数据执行写操作;16.读请求执行模块,用于针对类型为读请求的所述数据库访问请求,通过其对应的目标读线程按照rcu同步机制对所述存储数据执行读操作。17.第三方面,本发明实施例提供一种电子设备,包括:处理器和存储器,所述处理器用于执行所述存储器中存储的软件服务程序,以实现权利要求第一方面中所述的用于数据库的多线程数据处理方法。18.第四方面,本发明实施例提供一种存储介质,所述存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现权利要求第一方面中所述的用于数据库的多线程数据处理方法。19.根据本发明实施例提供的技术方案,数据库中包括至少一个主线程、两个或两个以上读线程以及一个写线程,且该数据库中存储的数据结构满足rcu同步机制,其中,由主线程负责接收客户端的请求信息,并发送给任一读线程;由读线程进行协议解析,确定请求类型,进而根据请求类型确定处理该请求的目标线程(读线程或写线程);因此,将原来主线程的读、写操作分别由读线程、写线程来处理,可以提高数据处理效率;此外,由于数据库中存储的数据的数据结构满足rcu(read-copyupdate)同步机制,可以解决读写并发冲突问题,而支持读写并发访问,提高数据库读写性能,且更能满足读多写少的业务场景需求。附图说明20.图1为本发明实施例示出的一种用于数据库的多线程处理方法的多线程间数据交互示意图;21.图2为本发明实施例提供的一种用于数据库的数据结构处理方法的实施例流程图;22.图3为本发明实施例提供的一种用于数据库的多线程数据处理方法的实施例流程图;23.图4为本发明实施例提供的一种用于数据库的多线程数据处理装置的实施例框图;24.图5为本发明实施例提供的一种电子设备的结构示意图。具体实施方式25.为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。26.相关技术中,数据库多线程处理过程主要由io-threads(线程池)和一个主线程实现,示例性地,由io-threads接收客户端的数据库访问请求,并解析和识别数据库访问请求中数据库网络协议,确定该数据库访问请求类型后,进而发送给主线程;主线程接收到io-threads解析和识别后的数据库访问请求后,执行数据库读或写相关的请求操作,最后将读/写结果返回给io-threads,以由io-threads发送给客户端。可见,相关技术中的多线程处理只是将数据库访问请求的接收、解析过程由io-threads来处理,但读写仍然依赖于主线程;而在读写并发访问时,读写操作都由主线程来操作执行,严重影响数据库的性能高。27.本发明提供的技术方案,由于数据库使用场景多以读多写少的业务场景为主,因此,本发明提供的技术方案,一方面保持了数据库的多线程,另一方面,解决数据库并发访问阻塞问题。示例性地,多线程可以包括至少一个主线程、两个或两个以上读线程以及一个写线程;其中,两个或两个以上读线程不但可以实现原io-threads网络i/o、数据库协议解析,还可以执行读相关的请求;而写相关的请求则由写线程来处理;而主线程负责接收数据库访问请求;此外,为了实现一个写线程和多个读线程之间共享数据结构,本发明引入了数据同步技术rcu(read-copyupdate,读-复制修改),即数据库中的数据结构满足rcu同步机制,解决了读写并发的问题,并且读相关的请求操作不会阻塞于写相关的请求操作。28.下面结合附图以具体实施例对本发明提供的一种用于数据库的多线程数据处理方法、装置和电子设备做进一步的解释说明,实施例并不构成对本发明实施例的限定。29.图1为本发明实施例示出的一种用于数据库的多线程处理方法的多线程间数据交互示意图。30.如图1所示,本发明实施例中的数据库可以包括至少一个主线程(mainthread)、多个读线程(readerthread)和一个写线程(writerthread),以及数据库的数据结构满足rcu同步机制。31.其中,主线程在接收到客户端的数据库访问请求的情况下,将数据库访问请求发送给读线程;读线程接收到数据库访问请求,进行数据库网络协议解析,确定数据库访问请求的类型(例如,读请求、写请求),如果是读请求,接收到数据库访问请求的读线程执行读请求相关操作;如果是写请求,读线程将接收到的数据库访问请求发送给写线程,由写线程执行写请求相关操作。综上,所有写请求相关的操作都是在写线程中进行,所以能保证数据库命令的原子语义,此外,本发明中数据库的数据结构具有rcu同步机制的特点,即“读,拷贝更新”,直接地,rcu-based同步机制的特点为随意读,但更新数据时,需要先复制数据得到一份副本,在副本上完成修改,最后再使用修改后的新数据替换旧数据,所有的需要数据同步的开销都在写线程端,读线程的同步开销几乎为零,因此,本发明的数据库的多线程处理具有较高的读性能,适合读多写少的业务场景。32.在本发明实施例中,要使数据库中的存储数据的数据结构均满足rcu同步机制,可以对数据库中不同数据结构类型进行转换处理,以为本发明实施例的用于数据库的多线程数据处理提供数据基础。可以理解的是,数据库(例如redisdb)存储由多种数据库结构,以redisdb为例,其存储了5种主要的数据结构以及相关的读写命令,其中,5种主要的数据结构类型为hash、string、list、set、zset,部分类型的数据结构满足rcu同步机制,但也有一部分类型的数据机构不满足rcu同步机制,因此,本发明实施例提供的用于数据库的数据结构处理方法可以对数据结构进行改造或转换处理,使数据库所有的数据结构都能满足rcu同步机制。下面结合附图详细介绍本发明实施例提供的用于数据库的数据结构处理方法。下面将结合图2对数据结构的转换处理进行详细介绍。33.图2为本发明实施例提供的一种用于数据库的数据结构处理方法的实施例流程图。如图2所示,一种用于数据库的数据结构处理方法可以包括如下步骤:34.步骤201,针对任一数据库,确定该数据库的数据结构类型。35.在一些实施例中,可以获取/读取数据库内核的hashentry中对应的类型值,再根据类型值确定该数据库的数据结构类型。示例性地,在hashentry中有关于类型值的定义,例如:unsignedtype:4;//fourdatastructuretypes:string,list,set,zsetandhash。通过读取该定义中的类型值,即可确定数据结构类型。36.在另一些实施例中,获取数据库中任一键值对中的值数据,根据值数据确定该数据库的数据结构类型。每种类型的数据结构主要对于键值对中的值数据(value),可以获取任一值数据来确定数据结构的类型。37.步骤202,根据数据结构类型对数据结构进行转换,以满足rcu同步机制。38.数据结构类型例如包括hash、string、list、set、zset,针对不同的类型,进行相应的转换处理。示例性地,数据结构类型为哈希hash结构,步骤202可以使用userspacercu库中的哈希数据结构cdslfht,来替换数据库中的哈希结构;数据结构类型为list结构,可以使用userspacercu库中的数据结构cds_list_head,来替换数据库中的list结构;数据结构类型为set结构,使用userspacercu库中的哈希数据结构cds_lfht,来替换数据库中的set结构。39.具体地,下面详细介绍每种类型的转换的实现过程:40.①hash类型的数据结构41.hash类型的数据结构,有两种实现方式:42.第一种,基于压缩列表ziplist的实现,一种连续、无序的数据结构,由一系列特殊编码的连续内存块组成的顺序型(sequential)数据结构,由于ziplist是一块开辟的连续内存,因此当需要修改时可以调用ziplistcopy复制一份数据,然后在新的ziplist上做数据的修改,最后通过rcu_assign_pointer把新的ziplist赋值给redisobject中的ptr指针,在syncrhonize_rcu()等待之后,释放掉旧的ziplist的内存,因此,其本身满足rcu同步机制。在本发明实施例中,在hashtable的元素小于64字节时,可以采用压缩列表ziplist的实现。具体而言,采用压缩列表ziplist对数据库中的数据进行转化处理。43.第二种,基于hashtablestructdict的实现(obj_encoding_ht);对于用structdict方式实现的hash数据结构,因为其不满足rcu同步体制的语义,在本发明实施例中可以采用两种方式:一、可以保持dict的实现不变,但是在每次dict有数据操作时,需要创建新的dictobject复制原hashtable中所有的dictentry,然后用rcu_assign_pointer把新的dict赋值给redisobject中的ptr指针,在synchroinze_rcu()等待之后,释放掉旧的dict及其所有dictentry的内存,然而,dict实现过程,如果有1w个key,则需要全部复制,才能更新一个key,效率很低;二、使用userspacercu库中的哈希数据结构cds_lfht来替代dict的实现。在本发明实施例中优选第二种方式实现,既可以使数据结构满足rcu同步机制,又可以节约内存,保持高效的处理,进而提高数据库的读写性能。44.②list类型45.在本发明实施例种,可以用rcu-based的cds_list_head实现来替代数据库中的list数据结构。46.③string类型47.string类型sds和ziplist一样是基于指针的,都是开辟的连续内存型的数据结构,因此本身就满足rcu同步机制。48.④set类型49.set类型的数据结构,一方面可以采用连续内存的obj_encoding_intset实现,另一方面,可以用cds_lfht的数据结构来替换set类型的数据结构。50.⑤redis中的zset类型51.zset类型的数据结构,一方面可以采用ziplist(obj_encoding_ziplist)的实现方式,另一方面,可以基于skiplist(小于预设值,预设值例如64字节)(obj_encoding_skiplist)的实现方式,skiplist的实现可以使用rcu机制的平衡树balancedtree来实现,具体可以参见相关技术中利用平衡树balancedtree实现skiplist的方案,在此不再赘述。此外,例如对于cds_lfht这样的数据结构,userspacercu库也提供了对于这样的数据结构的相关操作函数,例如查询函数cds_lfht_lookup、增删函数cds_lfht_add_replace等,示例性地:52.查询函数cds_lfht_lookup如下:53.cds_lfht_lookup(db-》dict-》table,hash,q_dictsdskeycasematch,key-》ptr,&iter);54.增删函数cds_lfht_add_replace如下:55.ht_node=cds_lfht_add_replace(d-》table,hash,q_dictsdskeycasematch,key,56.&de-》node);57.通过前述实施例,将数据库中存储数据的数据结构转换为满足rcu同步机制的数据结构,使得数据库在读写并发冲突的情况下,写线程不会阻塞读线程,为本发明实施例的数据库的多线程处理方案提供了数据基础,提升数据库整体的数据处理效率、性能。58.在数据库中的存储数据的数据结构满足rcu同步机制的基础上,本发明实施例提供一种用于数据库的多线程数据处理方法,下面将结合附图对本发明实施例进行详细介绍。59.图3为本发明实施例提供的一种用于数据库的多线程数据处理方法的实施例流程图。60.如图3所示,本发明实施例的一种用于数据库的多线程数据处理方法,其中,数据库包括可以至少一个主线程、两个或两个以上读线程以及一个写线程,且数据库中存储数据的数据结构满足rcu同步机制。读线程在访问被rcu保护的共享数据期间不会被阻塞,即当读线程在引用被rcu保护的共享数据期间,读线程所在的cpu不会发生上下文切换。61.以及,多线程(一个主线程、两个或两个以上读线程以及一个写线程)之间可以使用高性能的epoll模型来处理网络i/o。epoll模型可以利用事件循环(evetloop)监听所有注册过的客户端(client)的socket,当socket可读或者可写时,通过事件分派器调用对应的事件处理函数。在本发明实施例中,每一个读线程和写线程都可以运行一个自己的事件循环(evetloop),可以将调度的事件注册在epoll的消息线程eventloop上,以便让读线程/写线程得到调度的通知,进而执行相应操作。在本发明一些实施例,在读线程/写线程初始化的时候,创建套接字函数socketpairs,并把套接字函数socketparis的一端附带处理函数注册到epoll的消息线程eventloop上,示例性地,例如写线程初始化时的部分代码参考如下:62.socketpair(af_local,sock_stream,0,server.socketpairs)63.aecreatefileevent(server.el,server.socketpairs[0],ae_readable,server_event_process,null)[0064]本发明实施例的一种用于数据库的多线程数据处理方法,其中,数据库包括至少一个主线程、两个或两个以上读线程以及一个写线程,且数据库中存储数据的数据结构满足读-拷贝修改rcu同步机制,该方法可以包括如下步骤:[0065]步骤301,通过主线程接收来自客户端的多个数据库访问请求,数据库访问请求中包括数据库网络协议,将多个数据库访问请求分别发送至一个读线程。[0066]数据库网络协议例如为套接字缓存(socketbuffer,linux网络核心数据结构)、tcpsocket传输的应用层数据。主线程接收客户端的数据库访问请求,即将数据库访问请求发送至读线程。在本发明实施例中有多个读线程,主线程可以随机选择读线程以接收数据库访问请求,在同时有多个数据库访问请求时,主线程可以将该多个数据库访问请求分别发送至多个读线程。[0067]步骤302,针对任一数据库访问请求,通过目标读线程解析数据库访问请求中的数据库网络协议,以确定数据库访问请求的类型。[0068]其中,目标读线程为接收到数据库访问请求的读线程。示例性地,目标读线程接收到数据库访问请求后,进行协议解析,该数据库访问请求实际上是带标记字节的字符串列表,可以根据标记字节解析出客户端输入的是哪一类型的数据库访问请求。其中,协议解析可以采用相关技术中的协议解析工具或方法,在此不再赘述。[0069]在本发明实施例中,数据库访问请求的类型例如可以包括写请求和读请求。在一些实施例中,读线程可以对数据库访问请求进行解析,以得到客户端tcpsocket传输的应用层数据,从而确定是读请求还是写请求。[0070]步骤303,在多个数据库访问请求的类型包括读请求和写请求,且读请求和写请求针对数据库中同一存储数据的情况下,针对类型为写请求的数据库访问请求,通过其对应的目标读线程,将数据库访问请求发送至写线程。[0071]其中,多个数据库访问请求或包括有读请求和写请求,且均为访问同一存储数据,即对统一存储数据的读写并发。在本发明实施例中,针对写请求,目标读线程将写请求发送至写线程上。[0072]步骤304,通过写线程按照rcu同步机制对存储数据执行写操作。[0073]在步骤303的基础上,写线程接收到数据库访问请求后,将执行写操作。[0074]在一些实施例中,步骤304可以包括如下几个步骤:[0075]步骤1、通过写线程从其对应的消息队列中获取读线程发送的数据库访问请求,其中,消息队列中的数据库访问请求是读线程调用队列接口写入的。[0076]示例性地,当确定数据库访问请求的类型为写请求时,目标读线程可以通过预设套接字向写线程发送写请求通知,并将数据库访问请求写入消息队列。写线程在接收到写请求通知后,从消息队列获取数据库访问请求,执行与数据库访问请求对应的写操作。其中,消息队列用于存储写请求类型的数据库访问请求。[0077]例如,示例性地,目标读线程可以通过向预设套接字例如server.socketpairs[1]中写入数据作为事件,来通知写线程有调度的请求(即写请求通知),实现部分代码例如为:[0078]buf[0]='r';[0079]write(server.socketpairs[1],buf,1)[0080]另,目标读线程将数据库访问请求写入消息队列的实现,例如可以在目标读线程readerthread中创建数据库访问请求q_command_request的消息队列,并通过队列接口cds_wfcq_enqueue()的api,把数据库访问请求q_command_request添加到写线程writerthread的需求队列requestqueue(例如第一消息队列)上。示例性地,可以通过如下部分代码实现:[0081][0082][0083]步骤2、基于数据库访问请求,按照rcu同步机制对存储数据进行复制,以生成存储数据的副本数据。[0084]写线程在获取到数据库访问请求后,不会直接对存储数据执行写操作,而是先复制存储数据,生成存储数据的副本数据。[0085]步骤3、利用与数据库访问请求对应的目标数据更新存储数据。[0086]在一些实施例中,数据访问请求可以包括目标数据对应的关键字key。步骤3可以通过如下步骤实现:[0087]步骤3-1,创建第一哈希条目,第一哈希条目用于存储目标数据,目标数据作为第一哈希条目的值value;[0088]步骤3-2,从预设哈希表查找第二哈希条目,第二哈希条目对应的关键字key与数据库访问请求中的关键字key相同;[0089]步骤3-3,调用预设调换函数,以将存储有目标数据的第一哈希条目添加至预设哈希表中的第二哈希条目,以更新存储数据。[0090]其中,预设调换函数例如为rcu中的cds_lfht_add_replace()函数。示例性地,写线程完成写请求,可以由setkey()函数完成,并由dbadd()函数和数据库重写函数dboverwrite()调用q_dictadd(),最终实现写请求及将新的数据对于的哈希条目添加到数据库中。[0091]步骤305,针对类型为读请求的数据库访问请求,通过其对应的目标读线程按照rcu同步机制对存储数据执行读操作。[0092]在一些实施例中,针对类型为读请求的数据库访问请求,通过目标读线程读取存储数据的副本数据,以得到与数据库访问对应的存储数据。在另一些实施例中,如果写线程在副本数据基础上执行存储数据的写操作,则,目标读线程可以直接读取存储。[0093]示例性地,目标读线程执行读请求的操作步骤例如可以包括:步骤一、在调用数据库的读锁后,根据数据库访问请求查询数据库的哈希表;步骤二、确定数据库的哈希表中与数据库访问请求对应的目标键值对,以将目标键值对中的值信息为待读取的存储数据;步骤三、按照rcu同步机制读取目标键值对中的值信息;步骤四、调用数据库的解锁;步骤五、将读取到的存储数据发送至客户端。示例性地,以上步骤可以通过如下部分代码实现:[0094][0095][0096]详细地,在目标读线程对读请求的实现过程中,需要根据客户端client传入的数据库访问请求(例如数据库网络协议中包括的关键字符串keysdsstring),来查找数据库(例如,redisdb)中相应的哈希表hashtable。在本发明实施例中,数据库存储的数据的数据结构满足rcu同步机制,即数据库的最外层的哈希表hashtable改造成了rcu版本的cds_lfht,因此,执行读请求操作即在访问rcu的hashtable;访问rcu的hashtable之前,可以调用rcu读锁rcu_read_lock(),以对hashtable进行“上锁”处理,避免数据被其他线程处理;并在访问结束之后,调用rcu解锁rcu_read_unlock(),以对hashtable进行“解锁”处理,解锁后hashtable即可被其他线程处理。如此,保证读请求执行获取的数据的准确性,以及避免因其他线程的干扰,影响读请求的执行效率。[0097]进一步地,在本发明一些实施例中,前述根据数据库访问请求查询数据库的哈希表,确定数据库的哈希表中与数据库访问请求对应的目标键值对,以将目标键值对中的值信息为待读取的存储数据的步骤,例如,可以调用查询函数lookupkeyreadorreply(),从数据库的dict数据哈希表中查找对应的key值(即目标键值中的key值)来实现,进一步地,查询函数lookupkeyreadorreply()可以调用lookupkey()函数,以获取与目标键值中的key值对应的value值信息,将该value值信息作为读取到的存储数据。[0098]其中,lookupkey()函数可以定义如下:[0099][0100][0101]综上,在本发明实施例中,提供了lookupkeyreadorreply()和lookupkey()等相关的查询函数api用以实现读请求的实现。而目标读线程在执行读请求相关操作前后,分别调用rcu_read_lock()和rcu_read_unlock(),既保证了读请求执行过程中不会被写线程释放,且rcu读锁rcu_read_lock()和rcu解锁rcu_read_unlock()只做counter的记录工作,不涉及到cpucores之间耗时,且读写同步操作且不被写线程writerthread阻塞,从而提高数据库的读性能。[0102]在本发明的一些实施例中,在数据库中写入与数据库访问请求对应的目标数据之后,写线程可以调用预设内存释放函数,以释放第二哈希条目的值value所占用的内存。例如,调用ruc中apicall_rcu()(即rcu的非阻塞api)以及释放函数q_freercudictentry来释放旧的数据占用的内存,以在无阻塞条件下实现内存回收。在另一些实施例中,写线程可以使用globalcounter统计其维护的数据,以确定是否完成写操作,同时结合读线程中的读锁/解锁rcu_read_lock/unlock()的薄记工作,来确定目标读线程是否已完成存储数据的读取,从而决定何时可以安全的释放旧数据的内存,即针对同一数据,存在读写并发访问时,写线程既可以保证写请求的实现,又可以保证读线程读取到待读取的存储数据,且在两者均完成后,再安全释放回收内存。[0103]前述完成写请求及释放内存的步骤,其实现的部分代码可以参考如下:[0104]实现部分代码可参见如下:[0105][0106][0107]根据本发明实施例的一些实施例,写线程还可以向目标读线程发送操作完成通知,以使读线程将操作完成通知发送至客户端,即将cpu使用权从写线程调度回目标读线程。示例性地,当写线程处理完数据库访问请求对应的写操作后,例如目标写请求q_command_request(即类型为写请求的数据库访问请求),可以通过调用dispatch_to_worker函数再把客户端调度回原来的目标读线程,以使得目标读线程将操作完成通知发给客户端,实现部分代码例如如下:[0108][0109][0110]综上,根据本发明实施例提供的技术方案,数据库中包括至少一个主线程、两个或两个以上读线程以及一个写线程,且该数据库中存储的数据结构满足rcu同步机制,其中,由主线程负责接收客户端的请求信息,并发送给任一读线程;由读线程进行协议解析,确定请求类型,进而根据请求类型确定处理该请求的目标线程(读线程或写线程);因此,将原来主线程的读、写操作分别由读线程、写线程来处理,可以提高数据处理效率;此外,由于数据库中存储的数据的数据结构满足rcu(read-copyupdate)同步机制,可以解决读写并发冲突问题,而支持读写并发访问,提高数据库读写性能,且更能满足读多写少的业务场景需求。[0111]图1-图3详细描述了本发明实施例提供的数据库的多线程处理方法的实现过程,本发明还提供了与前述方法实施例对应的装置,下面将结合附图对本发明实施例提供的装置进行详细描述。[0112]图4为本发明实施例提供的一种用于数据库的多线程数据处理装置的实施例框图。[0113]如图4所示,一种用于数据库的多线程数据处理装置,其中,数据库包括至少一个主线程、两个或两个以上读线程以及一个写线程,且数据库中存储数据的数据结构满足rcu同步机制,该装置包括客户端连接模块41、请求解析模块42、写请求发送模块43、写请求执行模块44和读请求执行模块45。[0114]客户端连接模块41,用于通过所述主线程接收来自客户端的多个数据库访问请求,所述数据库访问请求中包括数据库网络协议,将多个所述数据库访问请求分别发送至一个读线程;[0115]请求解析模块42,用于针对任一所述数据库访问请求,通过目标读线程解析所述数据库访问请求中的所述数据库网络协议,以确定所述数据库访问请求的类型,所述目标读线程为接收到所述数据库访问请求的读线程;[0116]写请求发送模块43,用于在多个所述数据库访问请求的类型包括读请求和写请求,且所述读请求和写请求针对所述数据库中同一存储数据的情况下,针对类型为写请求的数据库访问请求,通过其对应的目标读线程,将所述数据库访问请求发送至所述写线程;[0117]写请求执行模块44,用于通过所述写线程按照rcu同步机制对所述存储数据执行写操作;[0118]读请求执行模块45,用于针对类型为读请求的所述数据库访问请求,通过其对应的目标读线程按照rcu同步机制对所述存储数据执行读操作。[0119]在一些实施例中,读请求执行模块45可以包括:[0120]表查询单元(图中未示出),用于在调用所述数据库的读锁后,查询所述数据库的哈希表;[0121]键值对确定单元(图中未示出),用于确定所述数据库的哈希表中与所述数据库访问请求对应的目标键值对,所述目标键值对中的值信息为待读取的存储数据;[0122]值读取单元(图中未示出),用于按照rcu同步机制读取所述目标键值对中的值信息;[0123]解锁调用单元(图中未示出),用于调用所述数据库的解锁;[0124]发送单元(图中未示出),用于将读取到的存储数据发送至所述客户端。[0125]在一些实施例中,写请求执行模块44可以包括:[0126]请求获取单元(图中未示出),用于通过所述写线程从其对应的消息队列中获取所述读线程发送的所述数据库访问请求;其中,所述消息队列中的数据库访问请求是所述读线程调用队列接口写入的;[0127]副本生成单元(图中未示出),用于基于所述数据库访问请求,按照rcu同步机制对所述存储数据进行复制,以生成所述存储数据的副本数据;[0128]写执行单元(图中未示出),用于在生成所述存储数据的副本数据后,利用与所述数据库访问请求对应的目标数据更新所述存储数据。[0129]在一些实施例中,数据访问请求包括目标数据对应的关键字key,写执行单元(图中未示出)可以包括:[0130]创建子单元(图中未示出),用于创建第一哈希条目,所述第一哈希条目用于存储所述目标数据,所述目标数据作为第一哈希条目的值value;[0131]表查询子单元(图中未示出),用于从预设哈希表查找第二哈希条目,所述第二哈希条目对应的关键字key与所述数据库访问请求中的关键字key相同;[0132]写执行子单元(图中未示出),用于调用预设调换函数,以将存储有目标数据的所述第一哈希条目添加至预设哈希表中的第二哈希条目,以更新所述存储数据。[0133]在一些实施例中,用于数据库的多线程数据处理装置还可以包括:[0134]线程调度模块(图中未示出),用于将cpu使用权从所述写线程调度回所述目标读线程。[0135]在一些实施例中,读请求执行模块还可以包括:[0136]副本读取单元(图中未示出),用于针对类型为读请求的所述数据库访问请求,通过所述目标读线程读取所述存储数据的副本数据,以得到与所述数据库访问对应的存储数据。[0137]综上,根据本发明实施例提供的技术方案,数据库中包括至少一个主线程、两个或两个以上读线程以及一个写线程,且该数据库中存储的数据结构满足rcu同步机制,其中,由主线程负责接收客户端的请求信息,并发送给任一读线程;由读线程进行协议解析,确定请求类型,进而根据请求类型确定处理该请求的目标线程(读线程或写线程);因此,将原来主线程的读、写操作分别由读线程、写线程来处理,可以提高数据处理效率;此外,由于数据库中存储的数据的数据结构满足rcu(read-copyupdate)同步机制,可以解决读写并发冲突问题,而支持读写并发访问,提高数据库读写性能,且更能满足读多写少的业务场景需求。[0138]图5为本发明实施例提供的一种的电子设备的结构示意图,图5所示的电子设备500包括:至少一个处理器501、存储器502、至少一个网络接口504和其他用户接口503。电子设备500中的各个组件通过总线系统505耦合在一起。可理解,总线系统505用于实现这些组件之间的连接通信。总线系统505除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图5中将各种总线都标为总线系统505。[0139]其中,用户接口503可以包括显示器、键盘或者点击设备(例如,鼠标,轨迹球(trackball)、触感板或者触摸屏等。[0140]可以理解,本发明实施例中的存储器502可以是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(read-onlymemory,rom)、可编程只读存储器(programmablerom,prom)、可擦除可编程只读存储器(erasableprom,eprom)、电可擦除可编程只读存储器(electricallyeprom,eeprom)或闪存。易失性存储器可以是随机存取存储器(randomaccessmemory,ram),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的ram可用,例如静态随机存取存储器(staticram,sram)、动态随机存取存储器(dynamicram,dram)、同步动态随机存取存储器(synchronousdram,sdram)、双倍数据速率同步动态随机存取存储器(doubledataratesdram,ddrsdram)、增强型同步动态随机存取存储器(enhancedsdram,esdram)、同步连接动态随机存取存储器(synchlinkdram,sldram)和直接内存总线随机存取存储器(directrambusram,drram)。本文描述的存储器502旨在包括但不限于这些和任意其它适合类型的存储器。[0141]在一些实施方式中,存储器502存储了如下的元素,可执行单元或者数据结构,或者他们的子集,或者他们的扩展集:操作系统5021和应用程序5022。[0142]其中,操作系统5021,包含各种系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务。应用程序5022,包含各种应用程序,例如媒体播放器(mediaplayer)、浏览器(browser)等,用于实现各种应用业务。实现本发明实施例方法的程序可以包含在应用程序5022中。[0143]在本发明实施例中,通过调用存储器502存储的程序或指令,具体的,可以是应用程序5022中存储的程序或指令,处理器501用于执行各方法实施例所提供的方法步骤,例如包括:[0144]一种用于数据库的多线程数据处理方法,所述数据库包括至少一个主线程、两个或两个以上读线程以及一个写线程,且所述数据库中存储数据的数据结构满足读-拷贝修改rcu同步机制,所述方法包括:[0145]通过所述主线程接收来自客户端的多个数据库访问请求,所述数据库访问请求中包括数据库网络协议,将多个所述数据库访问请求分别发送至一个读线程;[0146]针对任一所述数据库访问请求,通过目标读线程解析所述数据库访问请求中的所述数据库网络协议,以确定所述数据库访问请求的类型,所述目标读线程为接收到所述数据库访问请求的读线程;[0147]在多个所述数据库访问请求的类型包括读请求和写请求,且所述读请求和写请求针对所述数据库中同一存储数据的情况下,针对类型为写请求的数据库访问请求,通过其对应的目标读线程,将所述数据库访问请求发送至所述写线程;通过所述写线程按照rcu同步机制对所述存储数据执行写操作;[0148]针对类型为读请求的所述数据库访问请求,通过其对应的目标读线程按照rcu同步机制对所述存储数据执行读操作。[0149]上述本发明实施例揭示的方法可以应用于处理器501中,或者由处理器501实现。处理器501可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器501中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器501可以是通用处理器、数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现成可编程门阵列(fieldprogrammablegatearray,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本发明实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件单元组合执行完成。软件单元可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器502,处理器501读取存储器502中的信息,结合其硬件完成上述方法的步骤。[0150]可以理解的是,本文描述的这些实施例可以用硬件、软件、固件、中间件、微码或其组合来实现。对于硬件实现,处理单元可以实现在一个或多个专用集成电路(applicationspecificintegratedcircuits,asic)、数字信号处理器(digitalsignalprocessing,dsp)、数字信号处理设备(dspdevice,dspd)、可编程逻辑设备(programmablelogicdevice,pld)、现场可编程门阵列(field-programmablegatearray,fpga)、通用处理器、控制器、微控制器、微处理器、用于执行本技术所述功能的其它电子单元或其组合中。[0151]对于软件实现,可通过执行本文所述功能的单元来实现本文所述的技术。软件部分代码可存储在存储器中并通过处理器执行。存储器可以在处理器中或在处理器外部实现。[0152]本实施例提供的电子设备可以是如图5中所示的电子设备,可执行如图1-3中方法实施例的所有步骤,进而实现图1-3中方法的技术效果,具体请参照图1-3相关描述,为简洁描述,在此不作赘述。[0153]本发明实施例还提供了一种存储介质(计算机可读存储介质)。这里的存储介质存储有一个或者多个程序。其中,存储介质可以包括易失性存储器,例如随机存取存储器;存储器也可以包括非易失性存储器,例如只读存储器、快闪存储器、硬盘或固态硬盘;存储器还可以包括上述种类的存储器的组合。[0154]当存储介质中一个或者多个程序可被一个或者多个处理器执行,以实现上述在电子设备侧执行的方法实施例。[0155]所述处理器用于执行存储器中存储的程序,以实现以下在电子设备侧执行的方法实施例的步骤:[0156]所述数据库包括至少一个主线程、两个或两个以上读线程以及一个写线程,且所述数据库中存储数据的数据结构满足读-拷贝修改rcu同步机制,所述方法包括:[0157]通过所述主线程接收来自客户端的多个数据库访问请求,所述数据库访问请求中包括数据库网络协议,将多个所述数据库访问请求分别发送至一个读线程;[0158]针对任一所述数据库访问请求,通过目标读线程解析所述数据库访问请求中的所述数据库网络协议,以确定所述数据库访问请求的类型,所述目标读线程为接收到所述数据库访问请求的读线程;[0159]在多个所述数据库访问请求的类型包括读请求和写请求,且所述读请求和写请求针对所述数据库中同一存储数据的情况下,针对类型为写请求的数据库访问请求,通过其对应的目标读线程,将所述数据库访问请求发送至所述写线程;通过所述写线程按照rcu同步机制对所述存储数据执行写操作;[0160]针对类型为读请求的所述数据库访问请求,通过其对应的目标读线程按照rcu同步机制对所述存储数据执行读操作。[0161]专业人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。[0162]结合本文中所公开的实施例描述的方法或算法的步骤可以用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或
技术领域
:内所公知的任意其它形式的存储介质中。[0163]以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1