CN107590199B - 一种面向内存的多线程数据库设计方法 - Google Patents
一种面向内存的多线程数据库设计方法 Download PDFInfo
- Publication number
- CN107590199B CN107590199B CN201710710565.2A CN201710710565A CN107590199B CN 107590199 B CN107590199 B CN 107590199B CN 201710710565 A CN201710710565 A CN 201710710565A CN 107590199 B CN107590199 B CN 107590199B
- Authority
- CN
- China
- Prior art keywords
- memory
- data
- client application
- database
- multithreading
- 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
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开的一种面向内存的多线程数据库设计方法,包括以下步骤:步骤1,根据要支持的数据类型,设计并实现对应的内存容器;步骤2,设计内存数据库中键值对的组织方式;步骤3,设计与实现客户端的应用代理结构和服务管理结构;步骤4,设计客户端应用与内存数据库通信的协议解析模块;步骤5,内存数据库数据操作命令的处理解析;步骤6,设计并发模型;步骤7,实现淘汰策略和负载均衡;步骤8:设计并实现配置文件。本发明的设计方法方法在内存中重新设计了数据结构,并且在缓存、淘汰算法、并行操作方面也进行了相应的改进,提高了数据处理速度。
Description
技术领域
本发明属于数据存储与处理方法技术领域,具体涉及一种面向内存的多线程数据库设计方法。
背景技术
传统关系数据库在一些数据敏感的服务中表现出了较差的性能,例如为海量数据创建索引、高并发访问,高流量网站的网页服务、以及新兴的流式媒体直播以及视频服务。关系型数据库主要适用于执行规模小而读写频繁或者大批量极少写访问的事务处理,因而在高并发访问情况下性能会很差,究其原因,有以下几点:
(a)关系型数据库的数据模型一般是按照行存储,例如一条用户的信息要用多个字段存储,但是频繁修改的可能就其中一两个字段;
(b)关系型数据库中的IO(输入输出)问题,由于磁盘的IO速度总是落后于内存,当每秒十万、百万甚至更多的用户同时发起请求时,磁盘的处理速度就满足不了需求;
(c)在业务开发方面,基于行的存储可能会使得开发人员在数据获取与存储时,把重点转移到一些与业务无关的行为上,例如需要考虑如何从获取到的sql行数据中拆分出自己的数据模型;
(d)数据是碎片化的,查询数据库的操作很不友好,为了适应关系型数据库的逻辑会使代码变得复杂而与业务不相关,利用单个SELECT和多个JOIN语句查询联系人数据不太实际,当数据在多张表里面分布存储时,会导致多表查询的问题;
(e)全文搜索很困难,如果有人输入字符串“positionSitePoint”,操作者必须检查所有的表,看看它是否为联系人名字、电话、E-mail或者住址的一部分,并且需要做相应的排序。
由上可知,相对于基于磁盘存储的传统关系型数据库,内存数据库将数据保存在内存中能够极大地提高应用的性能;同时内存数据库抛弃了关系型数据库基于行、表的存储方式,而是在内存中重新设计了数据结构,并且在缓存、淘汰算法、并行操作方面也进行了相应的改进,所以数据处理速度比传统数据库的数据处理速度要快很多。
发明内容
本发明的目的是提供一种面向内存的多线程数据库设计方法,解决了现有关系型数据库开发和运维比较复杂,网络服务的实时性低、响应慢、数据量小的问题。
本发明所采用的技术方案是,一种面向内存的多线程数据库设计方法,包括以下步骤:
步骤1:根据需要支持的数据类型,选择对应的内存容器;
步骤2:确定内存数据库中键值对的组织方式;
步骤3:确定客户端应用代理结构和服务管理结构;
步骤4:确定步骤3中客户端应用代理结构与步骤2中内存数据库的通信协议解析模块;
步骤5:内存数据库数据操作的命令处理设定;
步骤6:设计并发模型;
步骤7:通过backend线程实现淘汰策略和负载均衡;
步骤8:实现配置文件。
本发明的特征还在于,
步骤1的具体为:
步骤1.1,确定数据类型,数据类型为字符串、链表、字典或集合中任意一种或多种;
步骤1.2,根据步骤1中数据类型,确定操作API、实现数据结构;
步骤1.3,确定对象系统,将封装底层数据结构作为一个对象,每个对象均有所属类型且由不同的数据结构编码。
步骤3具体包括:
(1)客户端应用代理结构的确定
客户端应用代理结构是管理客户端应用输入输出的代理结构,客户端应用代理结构嵌入命令与参数字段,且包括查询缓冲区以及发送缓冲区;
(4)服务管理结构的确定
服务管理结构是根据客户端应用代理结构进行内存数据库资源的分配,服务管理结构包括客户端应用代理链表和统计信息的数据结构。
步骤4的具体为:
步骤4.1,读取所有报文数据如命令和参数、到客户端应用代理结构的缓冲区;
步骤4.2,将缓冲区按照\n拆分;
步骤4.3,按照协议将对应的数据复制到客户端应用代理结构的命令与参数中。
步骤5的具体为:
步骤5.1:步骤4中的协议解析模块将需要执行的命令、参数复制到步骤3的客户端应用代理结构中;
步骤5.2:根据步骤5.1的客户端应用代理结构命令字段查找命令表,找到对应的函数指针并调用;
步骤5.3:将返回值复制到客户端应用代理的输出缓冲区中。
步骤6的并发模型通过创建一个Master线程和多个worker线程处理并发的事件,具体包括:
步骤6.1:选用多线程+IO复用的并发框架;
步骤6.2:封装底层的IO复用,实现一个类似libevent的事件库;
步骤6.3:封装线程以及线程通信的消息队列,不同角色的线程通过其结构内部的事件触发器来注册与监听,并且处理对应的事件;
步骤6.4:通过管道和消息队列两个渠道设计master与worker通信的协议,基本流程为:worker线程会监听管道的读事件,由master将新客户端句柄压入到消息队列后向管道中写入字符;worker线程通过事件触发器监听到管道中读到写入的字符,会创建一个客户端结构,然后与客户端进行交互。
步骤7淘汰策略有两种:backend定时扫描和惰性策略;负载均衡通过backend线程对内存数据库键值对重新hash实现。
步骤8的具体为:
步骤8.1,选择ini文件作为配置文件,快速读取到配置选项;
步骤8.2,设计并实现配置树,将所有的配置选项插入到配置树中,当执行写入配置文件的命令时,会将配置树的数据全部序列化到配置文件中。
本发明的有益效果是:本发明一种面向内存的多线程数据库设计方法通过在内存中重新设计了数据结构,并且在缓存、淘汰算法、并行操作方面也进行了相应的改进,相对于传统的关系型数据库提高了数据处理速度、开发和运维比较简单,网络服务的实时性高、响应快、数据量大,有很好的实用价值。
附图说明
图1是本发明内存数据库服务器端运行过程示意图;
图2是本发明内存数据库服务器端初始化过程;
图3是本发明并发框架启动流程图;
图4是本发明master启动流程图;
图5是本发明worker线程启动流程图;
图6是本发明并发框架的流程图。
具体实施方式
下面结合附图和具体实施方式对本发明进行详细说明。
本发明一种面向内存的多线程数据库设计方法,包括以下步骤:
步骤1:根据需要支持的数据类型,选择对应的内存容器;
步骤1.1,确定数据类型,数据类型为字符串、链表、字典或集合中任意一种或多种;
步骤1.2,根据步骤1中数据类型,确定操作API、实现数据结构;编码实现链表、字符串等数据类型,此处字典使用两张hash表实现,使用拉链法解决hash冲突,第二张hash表用来进行负载均衡;
步骤1.3,确定对象系统,将封装底层数据结构作为一个对象,每个对象均有所属类型且由不同的数据结构编码;一个对象结构中使用void*类型存储多种底层的数据结构,并且使用一个编码属性用来指示底层数据结构类型,最后还有一个属性对象类型,而对象和编码的关系是1对多。
步骤2:确定内存数据库中键值对的组织方式;
内存数据库其实就是使用一种数据结构来管理内存存储的数据,本发明的设计方法中使用字典对象来管理所有对象;内存数据库中键值对的组织是通过两个hash对象实现,第一个hash对象存储数据,第二个存储键及其过期时间,数据的核心操作就是对这两个hash对象进行操作。
步骤3:确定客户端应用代理结构和服务管理结构;
(1)客户端应用代理结构的确定
客户端应用代理结构主要存储前面的命令结构,并且内置一个输出缓冲区以及查询缓冲,分别用来存储输出和输入的报文,其是管理客户端应用输入输出的代理结构,客户端应用代理结构嵌入命令与参数字段,且包括查询缓冲区以及发送缓冲区;
(4)服务管理结构的确定
服务管理结构主要是用来管理命令表如静态函数指针数组启动时会被存储为字典类型以及一些配置信息、一些统计信息;其根据客户端应用代理结构进行内存数据库资源的分配,服务管理结构包括客户端应用代理链表和统计信息的数据结构,如图1和图2所示。
步骤4:确定步骤3中客户端应用代理结构与步骤2中内存数据库的通信协议解析模块;分析客户端与服务器交互的信息,基于命令、参数设计简单通信协议,该协议可以通过json或者xml实现,甚至可以兼容redis的通信协议;
步骤4.1,读取所有报文数据如命令和参数、到客户端应用代理结构的缓冲区;
步骤4.2,将缓冲区按照\n拆分,协议格式为:参数个数(包括命令)\n+[字符个数\n+对应报文\n]+...比如set name zhangcong协议报文为(*3\n$4\n name\n$9\nzhangcong\n)
步骤4.3,按照协议将对应的数据复制到客户端应用代理结构的命令与参数中。
步骤5:内存数据库数据操作的命令处理设定,思路为首先抽象出一个数据结构来存储命令的函数名、参数;其次设计统一的接口,主要指参数列表相同,可使用函数指针、仿函数或者c++模板实现:
步骤5.1:步骤4中的协议解析模块将需要执行的命令、参数复制到步骤3的客户端应用代理结构中;
步骤5.2:根据步骤5.1的客户端应用代理结构命令字段查找命令表,找到对应的函数指针并调用;
步骤5.3:将返回值复制到客户端应用代理的输出缓冲区中。
步骤6:设计并发模型;
步骤6.1:选用多线程+IO复用的并发框架,如图3所示;
步骤6.2:封装底层的IO复用,实现一个类似libevent的事件库;
步骤6.3:封装线程以及线程通信的消息队列,不同角色的线程通过其结构内部的事件触发器来注册与监听,并且处理对应的事件;
步骤6.4:通过管道和消息队列两个渠道设计master与worker通信的协议,master与worker运行流程分别图4和图5所示:Master线程负责给worker线程分发任务,worker线程负责客户端信息的交互;Master监听客户端应用连接,Master线程循环listen并轮询选择worker线程,同时将对应的客户端应用fd(客户端应用连接句柄,标识不同的客户端应用)压入其消息队列;设计Master与worker之间的通信协议,Master向管道写入某一特定字符,如’c’,worker线程在监听管道时读到’c’,则意味监听到客户端应用信息;worker线程监听管道一旦监听到客户端应用信息,worker线程从消息队列中获取客户端应用fd进行协议解析,处理命令完成之后,将数据返回至客户端应用代理的发送缓冲区,本发明的设计方法的整体并发框架如图6所示。
步骤7:通过backend线程实现淘汰策略和负载均衡;
由于内存数据库的数据只针对内存存储,而内存空间有限,需要进行过期数据的淘汰。而大量的增删操作后,内存数据库中的键值对会出现分布不均匀的情况,将导致查询效率低下,影响性能,故需进行内存数据库的负载均衡操作,具体操作为:
淘汰策略是指淘汰过期的键值对,主要有两种方式:(1)backend定时扫描,发现过期键值对即删除;(2)惰性策略,当对键值进行操作时,用backend线程判断其是否过期,过期即删除;
负载均衡是指在内存数据库长期的操作后,会造成hash表中内存数据库键值对的不均衡,通过backend线程对内存数据库键值对重新进行hash分配。
步骤8:实现配置文件。
配置文件用来设置一些服务管理结构运行的参数以及资源限制,比如线程个数、内存限制等过载处理设置,具体为:
步骤8.1,为了简单高效,选择ini文件作为配置文件,使得程序可以快速的读取到配置选项;
步骤8.2,设计并实现配置树,为了能够将动态配置的配置选项写入配置文件,将所有的配置选项插入到树中,当执行写入配置文件的命令时,会将配置树的数据全部序列化到配置文件中。
Claims (6)
1.一种面向内存的多线程数据库设计方法,其特征在于,包括以下步骤:
步骤1:根据需要支持的数据类型,选择对应的内存容器;
步骤2:确定内存数据库中键值对的组织方式,所述内存数据库中键值对的组织是通过两个hash对象实现,第一个hash对象存储数据,第二个存储键及其过期时间;
步骤3:确定客户端应用代理结构和服务管理结构,具体包括:
(1)客户端应用代理结构的确定,客户端应用代理结构是管理客户端应用输入输出的代理结构,客户端应用代理结构嵌入命令与参数字段,且包括查询缓冲区以及发送缓冲区;
(2)服务管理结构的确定,服务管理结构是根据客户端应用代理结构进行内存数据库资源的分配,服务管理结构包括客户端应用代理链表和统计信息的数据结构,
步骤4:确定步骤3中客户端应用代理结构与步骤2中内存数据库的通信协议解析模块;
步骤5:内存数据库数据操作的命令处理设定,具体步骤为:
步骤5.1:步骤4中的协议解析模块将需要执行的命令、参数复制到步骤3的客户端应用代理结构中;
步骤5.2:根据步骤5.1的客户端应用代理结构命令字段查找命令表,找到对应的函数指针并调用;
步骤5.3:将返回值复制到客户端应用代理的输出缓冲区中;
步骤6:设计并发模型;
步骤7:通过backend线程实现淘汰策略和负载均衡;
步骤8:实现配置文件。
2.根据权利要求1所述的一种面向内存的多线程数据库设计方法,其特征在于,所述步骤1的具体为:
步骤1.1,确定数据类型,数据类型为字符串、链表、字典或集合中任意一种或多种;
步骤1.2,根据步骤1中数据类型,确定操作API、实现数据结构;
步骤1.3,确定对象系统,将封装底层数据结构作为一个对象,每个对象均有所属类型且由不同的数据结构编码。
3.根据权利要求1所述的一种面向内存的多线程数据库设计方法,其特征在于,所述步骤4的具体为:
步骤4.1,读取所有报文数据如命令和参数、到客户端应用代理结构的缓冲区;
步骤4.2,将缓冲区按照\n拆分;
步骤4.3,按照协议将对应的数据复制到客户端应用代理结构的命令与参数中。
4.根据权利要求1所述的一种面向内存的多线程数据库设计方法,其特征在于,所述步骤6的并发模型通过创建一个Master线程和多个worker线程处理并发的事件,具体包括:
步骤6.1:选用多线程+IO复用的并发框架;
步骤6.2:封装底层的IO复用,实现一个类似libevent的事件库;
步骤6.3:封装线程以及线程通信的消息队列,不同角色的线程通过其结构内部的事件触发器来注册与监听,并且处理对应的事件;
步骤6.4:通过管道和消息队列两个渠道设计master与worker通信的协议,基本流程为:worker线程会监听管道的读事件,由master将新客户端句柄压入到消息队列后向管道中写入字符;worker线程通过事件触发器监听到管道中读到写入的字符,会创建一个客户端结构,然后与客户端进行交互。
5.根据权利要求1所述的一种面向内存的多线程数据库设计方法,其特征在于,所述步骤7淘汰策略有两种:backend定时扫描和惰性策略;
所述的负载均衡通过backend线程对内存数据库键值对重新hash实现。
6.根据权利要求1所述的一种面向内存的多线程数据库设计方法,其特征在于,所述步骤8的具体为:
步骤8.1,选择ini文件作为配置文件,快速读取到配置选项;
步骤8.2,设计并实现配置树,将所有的配置选项插入到配置树中,当执行写入配置文件的命令时,会将配置树的数据全部序列化到配置文件中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710710565.2A CN107590199B (zh) | 2017-08-18 | 2017-08-18 | 一种面向内存的多线程数据库设计方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710710565.2A CN107590199B (zh) | 2017-08-18 | 2017-08-18 | 一种面向内存的多线程数据库设计方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107590199A CN107590199A (zh) | 2018-01-16 |
CN107590199B true CN107590199B (zh) | 2019-12-24 |
Family
ID=61042235
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710710565.2A Active CN107590199B (zh) | 2017-08-18 | 2017-08-18 | 一种面向内存的多线程数据库设计方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107590199B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111338583B (zh) * | 2020-05-19 | 2020-08-25 | 北京数字绿土科技有限公司 | 一种高频数据存储方法、装置、计算机 |
CN111930781B (zh) * | 2020-07-24 | 2024-09-13 | 北京金山云网络技术有限公司 | 对缓存数据库的数据请求的处理方法和装置 |
CN115794356B (zh) * | 2023-01-31 | 2023-04-28 | 深圳方位通讯科技有限公司 | 基于ssh服务器的多线程同步连接处理方法 |
CN118520025A (zh) * | 2024-07-23 | 2024-08-20 | 北京快立方科技有限公司 | 一种数据库数据处理方法、装置、系统及设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101676906A (zh) * | 2008-09-18 | 2010-03-24 | 中兴通讯股份有限公司 | 一种利用位图对内存数据库空间进行管理的方法 |
CN104734915A (zh) * | 2015-03-05 | 2015-06-24 | 重庆邮电大学 | 一种复合多进程多线程的多网络并发动态仿真方法 |
CN105095520A (zh) * | 2015-09-23 | 2015-11-25 | 电子科技大学 | 面向结构化数据的分布式内存数据库索引方法 |
CN105550271A (zh) * | 2015-12-10 | 2016-05-04 | 成都广达新网科技股份有限公司 | 一种基于键值对的内存数据库查询方法及装置 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8027996B2 (en) * | 2007-11-29 | 2011-09-27 | International Business Machines Corporation | Commitment control for less than an entire record in an in-memory database in a parallel computer system |
US8607019B2 (en) * | 2011-02-15 | 2013-12-10 | Shine C. Chung | Circuit and method of a memory compiler based on subtractive approach |
US10521413B2 (en) * | 2015-11-20 | 2019-12-31 | Oath Inc. | Location-based recommendations using nearest neighbors in a locality sensitive hashing (LSH) index |
-
2017
- 2017-08-18 CN CN201710710565.2A patent/CN107590199B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101676906A (zh) * | 2008-09-18 | 2010-03-24 | 中兴通讯股份有限公司 | 一种利用位图对内存数据库空间进行管理的方法 |
CN104734915A (zh) * | 2015-03-05 | 2015-06-24 | 重庆邮电大学 | 一种复合多进程多线程的多网络并发动态仿真方法 |
CN105095520A (zh) * | 2015-09-23 | 2015-11-25 | 电子科技大学 | 面向结构化数据的分布式内存数据库索引方法 |
CN105550271A (zh) * | 2015-12-10 | 2016-05-04 | 成都广达新网科技股份有限公司 | 一种基于键值对的内存数据库查询方法及装置 |
Non-Patent Citations (1)
Title |
---|
多线程内存数据库服务器设计;宋广华;《计算机工程与应用》;20010915;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN107590199A (zh) | 2018-01-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109800222B (zh) | 一种HBase二级索引自适应优化方法和系统 | |
US11113279B2 (en) | Materialized views based on access rights | |
US11093468B1 (en) | Advanced metadata management | |
CN107590199B (zh) | 一种面向内存的多线程数据库设计方法 | |
US20120130963A1 (en) | User defined function database processing | |
US11256666B2 (en) | Method and apparatus for handling digital objects in a communication network | |
US9930113B2 (en) | Data retrieval via a telecommunication network | |
US11966416B2 (en) | Cross-organization and cross-cloud automated data pipelines | |
CN113157411B (zh) | 一种基于Celery的可靠可配置任务系统及装置 | |
US11216421B2 (en) | Extensible streams for operations on external systems | |
CN114090580A (zh) | 数据处理方法、装置、设备、存储介质及产品 | |
CN115587118A (zh) | 任务数据的维表关联处理方法及装置、电子设备 | |
US20240020298A1 (en) | Serialization of data in a concurrent transaction processing distributed database | |
US11609934B2 (en) | Notification framework for document store | |
CN106934044B (zh) | 一种数据处理方法及装置 | |
US11341022B2 (en) | Runtime performance introspection | |
US20130007040A1 (en) | Distributed requests on remote data | |
CN112100186A (zh) | 基于分布式系统的数据处理方法、装置、计算机设备 | |
EP2990960A1 (en) | Data retrieval via a telecommunication network | |
US11514080B1 (en) | Cross domain transactions | |
US20240176775A1 (en) | Datastore workload isolation | |
Budholia | NewSQL Monitoring System | |
McGlothlin et al. | Scalable queries for large datasets using cloud computing: a case study | |
Buchwald et al. | Relative and non-relative databases performance with an Android platform application | |
CN118916359A (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 | ||
TR01 | Transfer of patent right | ||
TR01 | Transfer of patent right |
Effective date of registration: 20210401 Address after: 10449-020, unit 1, building 3, Huide Science Park, 32 Gaoxin 6th Road, Zhangba Street office, high tech Zone, Xi'an City, Shaanxi Province, 710000 Patentee after: Shaanxi Jida Chengde Wisdom Education Technology Co.,Ltd. Address before: 710048 No. 5 Jinhua South Road, Shaanxi, Xi'an Patentee before: XI'AN University OF TECHNOLOGY |