CN107590199A - 一种面向内存的多线程数据库设计方法 - Google Patents

一种面向内存的多线程数据库设计方法 Download PDF

Info

Publication number
CN107590199A
CN107590199A CN201710710565.2A CN201710710565A CN107590199A CN 107590199 A CN107590199 A CN 107590199A CN 201710710565 A CN201710710565 A CN 201710710565A CN 107590199 A CN107590199 A CN 107590199A
Authority
CN
China
Prior art keywords
data
client application
internal memory
thread
design method
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
Application number
CN201710710565.2A
Other languages
English (en)
Other versions
CN107590199B (zh
Inventor
王怀军
田玲
李军怀
张聪
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shaanxi Jida Chengde Wisdom Education Technology Co.,Ltd.
Original Assignee
Xian University of Technology
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Xian University of Technology filed Critical Xian University of Technology
Priority to CN201710710565.2A priority Critical patent/CN107590199B/zh
Publication of CN107590199A publication Critical patent/CN107590199A/zh
Application granted granted Critical
Publication of CN107590199B publication Critical patent/CN107590199B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

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 (8)

1.一种面向内存的多线程数据库设计方法,其特征在于,包括以下步骤:
步骤1:根据需要支持的数据类型,选择对应的内存容器;
步骤2:确定内存数据库中键值对的组织方式;
步骤3:确定客户端应用代理结构和服务管理结构;
步骤4:确定步骤3中客户端应用代理结构与步骤2中内存数据库的通信协议解析模块;
步骤5:内存数据库数据操作的命令处理设定;
步骤6:设计并发模型;
步骤7:通过backend线程实现淘汰策略和负载均衡;
步骤8:实现配置文件。
2.根据权利要求1所述的一种面向内存的多线程数据库设计方法,其特征在于,所述步骤1的具体为:
步骤1.1,确定数据类型,数据类型为字符串、链表、字典或集合中任意一种或多种;
步骤1.2,根据步骤1中数据类型,确定操作API、实现数据结构;
步骤1.3,确定对象***,将封装底层数据结构作为一个对象,每个对象均有所属类型且由不同的数据结构编码。
3.根据权利要求1所述的一种面向内存的多线程数据库设计方法,其特征在于,所述步骤3具体包括:
(1)客户端应用代理结构的确定
客户端应用代理结构是管理客户端应用输入输出的代理结构,客户端应用代理结构嵌入命令与参数字段,且包括查询缓冲区以及发送缓冲区;
(4)服务管理结构的确定
服务管理结构是根据客户端应用代理结构进行内存数据库资源的分配,服务管理结构包括客户端应用代理链表和统计信息的数据结构。
4.根据权利要求1所述的一种面向内存的多线程数据库设计方法,其特征在于,所述步骤4的具体为:
步骤4.1,读取所有报文数据如命令和参数、到客户端应用代理结构的缓冲区;
步骤4.2,将缓冲区按照\n拆分;
步骤4.3,按照协议将对应的数据复制到客户端应用代理结构的命令与参数中。
5.根据权利要求1所述的一种面向内存的多线程数据库设计方法,其特征在于,所述步骤5的具体步骤为:
步骤5.1:步骤4中的协议解析模块将需要执行的命令、参数复制到步骤3的客户端应用代理结构中;
步骤5.2:根据步骤5.1的客户端应用代理结构命令字段查找命令表,找到对应的函数指针并调用;
步骤5.3:将返回值复制到客户端应用代理的输出缓冲区中。
6.根据权利要求1所述的一种面向内存的多线程数据库设计方法,其特征在于,所述步骤6的并发模型通过创建一个Master线程和多个worker线程处理并发的事件,具体包括:
步骤6.1:选用多线程+IO复用的并发框架;
步骤6.2:封装底层的IO复用,实现一个类似libevent的事件库;
步骤6.3:封装线程以及线程通信的消息队列,不同角色的线程通过其结构内部的事件触发器来注册与监听,并且处理对应的事件;
步骤6.4:通过管道和消息队列两个渠道设计master与worker通信的协议,基本流程为:worker线程会监听管道的读事件,由master将新客户端句柄压入到消息队列后向管道中写入字符;worker线程通过事件触发器监听到管道中读到写入的字符,会创建一个客户端结构,然后与客户端进行交互。
7.根据权利要求1所述的一种面向内存的多线程数据库设计方法,其特征在于,所述步骤7淘汰策略有两种:backend定时扫描和惰性策略;
所述的负载均衡通过backend线程对内存数据库键值对重新hash实现。
8.根据权利要求1所述的一种面向内存的多线程数据库设计方法,其特征在于,所述步骤8的具体为:
步骤8.1,选择ini文件作为配置文件,快速读取到配置选项;
步骤8.2,设计并实现配置树,将所有的配置选项***到配置树中,当执行写入配置文件的命令时,会将配置树的数据全部序列化到配置文件中。
CN201710710565.2A 2017-08-18 2017-08-18 一种面向内存的多线程数据库设计方法 Active CN107590199B (zh)

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 true CN107590199A (zh) 2018-01-16
CN107590199B 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)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111338583A (zh) * 2020-05-19 2020-06-26 北京数字绿土科技有限公司 一种高频数据存储方法、结构、计算机
CN115794356A (zh) * 2023-01-31 2023-03-14 深圳方位通讯科技有限公司 基于ssh服务器的多线程同步连接处理方法

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20090144337A1 (en) * 2007-11-29 2009-06-04 Eric Lawrence Barsness Commitment control for less than an entire record in an in-memory database in a parallel computer system
CN101676906A (zh) * 2008-09-18 2010-03-24 中兴通讯股份有限公司 一种利用位图对内存数据库空间进行管理的方法
US20120209888A1 (en) * 2011-02-15 2012-08-16 Chung Shine C Circuit and Method of a Memory Compiler Based on Subtraction Approach
CN104734915A (zh) * 2015-03-05 2015-06-24 重庆邮电大学 一种复合多进程多线程的多网络并发动态仿真方法
CN105095520A (zh) * 2015-09-23 2015-11-25 电子科技大学 面向结构化数据的分布式内存数据库索引方法
CN105550271A (zh) * 2015-12-10 2016-05-04 成都广达新网科技股份有限公司 一种基于键值对的内存数据库查询方法及装置
US20170147575A1 (en) * 2015-11-20 2017-05-25 Yahoo! Inc. Location-Based Recommendations Using Nearest Neighbors in a Locality Sensitive Hashing (LSH) Index

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20090144337A1 (en) * 2007-11-29 2009-06-04 Eric Lawrence Barsness Commitment control for less than an entire record in an in-memory database in a parallel computer system
CN101676906A (zh) * 2008-09-18 2010-03-24 中兴通讯股份有限公司 一种利用位图对内存数据库空间进行管理的方法
US20120209888A1 (en) * 2011-02-15 2012-08-16 Chung Shine C Circuit and Method of a Memory Compiler Based on Subtraction Approach
CN104734915A (zh) * 2015-03-05 2015-06-24 重庆邮电大学 一种复合多进程多线程的多网络并发动态仿真方法
CN105095520A (zh) * 2015-09-23 2015-11-25 电子科技大学 面向结构化数据的分布式内存数据库索引方法
US20170147575A1 (en) * 2015-11-20 2017-05-25 Yahoo! Inc. Location-Based Recommendations Using Nearest Neighbors in a Locality Sensitive Hashing (LSH) Index
CN105550271A (zh) * 2015-12-10 2016-05-04 成都广达新网科技股份有限公司 一种基于键值对的内存数据库查询方法及装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
宋广华: "多线程内存数据库服务器设计", 《计算机工程与应用》 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111338583A (zh) * 2020-05-19 2020-06-26 北京数字绿土科技有限公司 一种高频数据存储方法、结构、计算机
CN115794356A (zh) * 2023-01-31 2023-03-14 深圳方位通讯科技有限公司 基于ssh服务器的多线程同步连接处理方法

Also Published As

Publication number Publication date
CN107590199B (zh) 2019-12-24

Similar Documents

Publication Publication Date Title
US11860874B2 (en) Multi-partitioning data for combination operations
US11151137B2 (en) Multi-partition operation in combination operations
US7487191B2 (en) Method and system for model-based replication of data
US11093468B1 (en) Advanced metadata management
CN100596353C (zh) 提供日志服务的方法及***
CN104699718B (zh) 用于快速引入业务数据的方法和装置
US8738568B2 (en) User-defined parallelization in transactional replication of in-memory database
US12014248B2 (en) Machine learning performance and workload management
US20120254249A1 (en) Database Management System
CN104935658B (zh) 一种银行任务分配方法及装置
EP2874077A2 (en) Stateless database cache
US9201700B2 (en) Provisioning computer resources on a network
CN102033912A (zh) 一种分布式数据库访问方法及***
KR102119258B1 (ko) 데이터베이스 관리 시스템에서의 변경 데이터 캡쳐 구현 기법
EP2706468A1 (en) Data storage and query method
JPWO2011108695A1 (ja) 並列データ処理システム、並列データ処理方法及びプログラム
CN105354328B (zh) 一种解决NoSQL数据库并发访问冲突的***及方法
US20200265028A1 (en) Method and systems for mapping object oriented/functional languages to database languages
US11553023B2 (en) Abstraction layer for streaming data sources
KR20200056357A (ko) 데이터베이스 관리 시스템에서의 변경 데이터 캡쳐 구현 기법
US10262024B1 (en) Providing consistent access to data objects transcending storage limitations in a non-relational data store
US20040172459A1 (en) Multi-tier business layer architecture for information systems
WO2023159976A1 (zh) 数据分段写入方法、数据读取方法及装置
Zhi et al. Research of Hadoop-based data flow management system
CN107590199A (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