PatViewer专利搜索

一种高速数据库设计方法

发明公布  在审
申请(专利)号:CN201811512411.3国省代码:江苏 32
申请(专利权)人:南京朝焱智能科技有限公司
温馨提示:Ctrl+D 请注意收藏,详细著录项请首页检索查看。 Please note the collection. For details, please search the home page.

摘要:
本发明提出了一种高速数据库设计方法,包括:利用Redis工具将接收到的实时采集数据存入缓存中;对缓存中的数据进行处理,包括判断缓存中的数据数量是否超过预设值,如果超过则将部分数据从缓存转至数据库中;当判断缓存中数据的数量超过预设值时,将缓存中的部分数据批量存储至所述数据库;对是否存储缓存的剩余数据进行判断;对所述数据库中数据分区分表以管理数据库。本发明能够处理大批量数据的存储,大大加快了数据存储的效率。

主权项:
1.一种高速数据库设计方法,其特征在于,包括如下步骤:步骤S1,利用Redis工具将接收到的实时采集数据存入缓存中;步骤S2,对缓存中的数据进行处理,包括判断缓存中的数据数量是否超过预设值,如果超过则将部分数据从缓存转至数据库中;步骤S3,当判断缓存中数据的数量超过预设值时,将缓存中的部分数据批量存储至所述数据库,包括:从Redis缓存中取出部分数据,对取出的数据进行遍历,分割出每条数据的字符串中的各个数据,将每条数据中的所有数据放入对应的Map对象中,对每个数据分配对应的key,遍历完成后,将所有解析出的Map放入Map集合中,再将Map集合放入对象中供存储调用,然后利用预编译sql语句配合循环操作,将数据批量存入数据库中;步骤S4,对是否存储缓存的剩余数据进行判断,包括:向采集数据的终端分配状态码,利用所述状态码标记是否接收到该终端的采集数据,如果未接收到终端的采集数据,则将所述Redis缓存中该终端对应的剩余数据存入至所述数据库中;步骤S5,对所述数据库中数据分区分表以管理数据库,包括:对存储的数据分段划分在多个分区位置存放,将数据所在的大表定时分成多个多张具有独立存储空间的实体子表。


说明书

一种高速数据库设计方法

技术领域

本发明涉及数据库技术领域,特别涉及一种高速数据库设计方法。

背景技术

在现有的数据库设计中,遇到实时数据需存储的情况如一直实时访问数据库无非
增加数据库压力,拖慢数据库的效率。

如遇到实时地位,实时监控等发送实时数据等情况,接收到的数据需要实时存入
数据库,每新增一条数据都需访问一次数据库将该数据存入,这样无限循环下去数据库会
不堪重负,也有可能导致数据的丢失。

目前也有大量数据库的设计方法以完善数据库的性能,但这些方法无法从根本上
同时兼顾到数据库的高效性与平台的展示性能。

发明内容

本发明的目的旨在至少解决所述技术缺陷之一。

为此,本发明的目的在于提出一种高速数据库设计方法。

为了实现上述目的,本发明的实施例提供一种高速数据库设计方法,包括如下步
骤:

步骤S1,利用Redis工具将接收到的实时采集数据存入缓存中;

步骤S2,对缓存中的数据进行处理,包括判断缓存中的数据数量是否超过预设值,
如果超过则将部分数据从缓存转至数据库中;

步骤S3,当判断缓存中数据的数量超过预设值时,将缓存中的部分数据批量存储
至所述数据库,包括:从Redis缓存中取出部分数据,对取出的数据进行遍历,分割出每条数
据的字符串中的各个数据,将每条数据中的所有数据放入对应的Map对象中,对每个数据分
配对应的key,遍历完成后,将所有解析出的Map放入Map集合中,再将Map集合放入对象中供
存储调用,然后利用预编译sql语句配合循环操作,将数据批量存入数据库中;

步骤S4,对是否存储缓存的剩余数据进行判断,包括:向采集数据的终端分配状态
码,利用所述状态码标记是否接收到该终端的采集数据,如果未接收到终端的采集数据,则
将所述Redis缓存中该终端对应的剩余数据存入至所述数据库中;

步骤S5,对所述数据库中数据分区分表以管理数据库,包括:对存储的数据分段划
分在多个分区位置存放,将数据所在的大表定时分成多个多张具有独立存储空间的实体子
表。

进一步,在所述步骤S3中,所述Redis缓存中数据的存储格式为:以逗号分隔的字
符串集合形式,遍历出所取数据的每条字符串,通过逗号来分割出字符串中的各个数据。

进一步,在所述步骤S3中,所述利用预编译sql语句配合循环操作,将数据批量存
入数据库中,包括:将所述预编译sql语句配合for循环遍历将数据批量存入数据库中,利用
循环方式执行预编译sql语句,将解析的数据放入逐条放入预编译sql语句中并执行insert
语句即可完成对解析数据的批量存储,清除Redis缓存中已经存放数据库的数据,将取出的
数据集中批量存入数据库中,加以定时,以此循环。

进一步,在所述步骤S3中,当判断缓存中数据的数量超过预设值时,依据数据存入
缓存的时间,将存入时间早的部分数据批量存入至所述数据库。

进一步,在所述步骤S4中,所述状态码包括在线和离线,当接收到终端的采集数据
时,向该终端分配的状态码为在线;当接收不到终端的采集数据时,向该终端分配的状态码
为离线,并所述Redis缓存中离线状态的终端对应的剩余数据存入至所述数据库中。

进一步,在所述步骤S5中,所述对存储的数据分段划分在多个分区位置存放,包
括:

设置每天分区时间;

当到达每天分区时间时,触发执行函数新建分区,将当天的数据将存入该分区内,
将数据分段划分在多个位置存放,分区后表面上还是一张表,但数据散列到多个位置。

进一步,当判断到达所述每天分区时间,查出表的最大分区并得到最大分区时期;

修改表,并在最大分区后面增加一个分区,时间范围增加一天;

拼接修改表的指令,然后执行指令;

执行完成后,销毁指令。

进一步,在所述步骤S5中,所述将数据所在的大表定时分成多个多张具有独立存
储空间的实体子表,包括:

设置每月分表时间;

将每月的表格都单独区分开,到达每月设定时间时将旧表格重新命名并新建表格
存储接下来的数据,将一个大表按照一定的规则分解成多张具有独立存储空间的实体子
表。

根据本发明实施例的高速数据库设计方法,首先利用Redis缓存将采集的数据实
时存入缓存内,再将缓存内的数据集中访问并批量存入数据库,缓存内的数据可供平台展
示。本发明采用通过状态码进行判断处理缓存剩余数据技术、数据库的定时按天分区按月
分表管理技术、定时生成表名技术和定时批量打包数据技术,能够处理大批量数据的存储,
大大加快了数据存储的效率,能够将平台界面和后台数据处理有效结合,有效避免数据丢
失的情况,并定时按天分区按月分表管理数据库。

本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变
得明显,或通过本发明的实践了解到。

附图说明

本发明的上述和/或附加的方面和优点从结合下面附图对实施例的描述中将变得
明显和容易理解,其中:

图1为根据本发明实施例的高速数据库设计方法的流程图;

图2为根据本发明实施例的缓存数据处理的流程图;

图3为根据本发明实施例的数据库的批量存储的流程图;

图4为根据本发明实施例的缓存剩余数据的判断流程图;

图5为根据本发明实施例的数据库分区分表的流程图;

图6为根据本发明实施例的定时事件按天执行流程图;

图7为根据本发明实施例的定时事件按月执行流程图。

具体实施方式

下面详细描述本发明的实施例,实施例的示例在附图中示出,其中自始至终相同
或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描
述的实施例是示例性的,旨在用于解释本发明,而不能理解为对本发明的限制。

如图1所示,本发明实施例的高速数据库设计方法,包括如下步骤:

步骤S1,利用Redis工具将接收到的实时采集数据存入缓存中。

具体的,本步骤采用Redis先行接收所采集的数据,然后暂时存放入缓存内。其中,
缓存即为数据交换的缓冲区,其存取速度要比内存快很多,平台可直接从缓存内获取数据。
本步骤利用缓存作为中间点存储实时最新的数据,采集到的数据首先下发存入缓存,平台
页面也可直接从缓存获取数据从而无需访问数据库,存取便携,可以从一定程度上大大减
轻了数据库的压力。

步骤S2,对缓存中的数据进行处理,包括判断缓存中的数据数量是否超过预设值,
如果超过则将部分数据从缓存转至数据库中。

由于缓存内的数据不可能让其一直保存,这样也发挥不出缓存的效用。因此需要
将缓存中的数据转存至数据库。

参考图2,将终端采集的数据,缓存到Redis缓存中。首先判断缓存内的数据量是否
达到设定的数量,如若达到则需将其存入数据库。

需要注意的是,不可将缓存内的数据全部存入数据库,否则平台页面会无法获取
展示数据,那么可先将一部分旧数据批量存入数据库,保留一部分最新的数据在缓存内以
供平台页面或者其他方面随时取用,这部分内容将在步骤S3中详细说明。

优选的,可以先将缓存中一半的旧数据从缓存中转存至数据库。

步骤S3,当判断缓存中数据的数量超过预设值时,将缓存中的部分数据批量存储
至数据库。

在本发明的一个实施例中,Redis缓存中数据的存储格式为:以逗号分隔的字符串
集合形式。例如:1)“aa,bb,cc”;2)“dd,ee,ff”,定时从redis取出一部分数据,通过遍历放
入自动化解析工具中,遍历出所取数据的每条字符串,通过逗号来分割出字符串中的各个
数据,例如:aa bb cc。

具体的,如图3所示,从Redis缓存中取出部分数据,对取出的数据进行遍历,分割
出每条数据的字符串中的各个数据,将每条数据中的所有数据放入对应的Map对象中。对每
个数据分配对应的key,遍历完成后,最后将所有的Map放入List集合中,成Map集合,将所有
解析出的Map放入Map集合中,再将Map集合放入对象中供存储调用,然后利用预编译sql语
句配合循环操作,将数据批量存入数据库中。

利用预编译sql语句配合循环操作,将数据批量存入数据库中,包括:将预编译sql
语句配合for循环遍历将数据批量存入数据库中,利用循环方式执行预编译sql语句,将解
析的数据放入逐条放入预编译sql语句中并执行insert语句即可完成对解析数据的批量存
储,清除Redis缓存中已经存放数据库的数据,将取出的数据集中批量存入数据库中,加以
定时,以此循环。

当判断缓存中数据的数量超过预设值时,依据数据存入缓存的时间,将存入时间
早的部分数据批量存入至数据库。

具体的,在存储时采用JDBC批处理方式,即为预编译sql语句配合for循环遍历将
数据批量存入数据库中,利用循环方式执行预编译sql语句,将解析的数据放入逐条放入预
编译sql语句中并执行insert语句即可完成对解析数据的批量存储。

将取出的旧数据集中批量存入数据库中,加以定时,以此循环,每当缓存中数据达
到指定数量,便将旧数据存入数据库中,在缓存中删除已存入数据库中的数据,这样集中处
理大大减少了访问数据库次数,同时也可避免了数据缺失的情况。加以结合数据库的分区
分表,有效地提高了数据库的效率。

步骤S4,对是否存储缓存的剩余数据进行判断。

具体的,如图4所示,向采集数据的终端分配状态码,利用状态码标记是否接收到
该终端的采集数据,如果未接收到终端的采集数据,则将Redis缓存中该终端对应的剩余数
据存入至数据库中。

在本发明的一个实施例中,状态码包括在线和离线,当接收到终端的采集数据时,
向该终端分配的状态码为在线;当接收不到终端的采集数据时,为保证所有数据的完整性,
向该终端分配的状态码为离线,并Redis缓存中离线状态的终端对应的剩余数据存入至数
据库中。此时不删除缓存内数据,等到再次接收到新数据首先删除剩余的新数据,这样可避
免数据的重复存入,同样不影响平台页面数据的获取显示功能。整体方案可利用多线程处
理,可实现高速的数据库管理操作。

步骤S5,对数据库中数据分区分表以管理数据库。

在本发明的实施例中,数据库:mysql数据库,版本:mysql5.0。

日常实时数据表格存储了百万级乃至千万级条记录,导致数据库在查询和插入的
时候耗时太长,性能低下。本发明采用分区分表的目的就是减少数据库的负担,提高数据库
的效率。

具体的,如图5所示,对存储的数据分段划分在多个分区位置存放,将数据所在的
大表定时分成多个多张具有独立存储空间的实体子表。

(1)分区

分区是将数据分段划分在多个位置存放。分区后,表面上还是一张表,但数据散列
到多个位置,分区的主要目的是为了在特定的Sql操作中减少数据读写的总量以缩减响应
时间。如果一张表的数据量达到了百万条记录,那么查询或者更新操作的性能会受到很大
的影响,而且随着时间的推移,性能会越来越差。

为了解决这个问题,本发明采用mysql5.0版本的数据库,提供了分区的功能,即将
表的记录分为多个分区,这样每个分区的记录数相对于整个表的记录数就小多了,当无论
是做查询还是插入更新操作的时候,只会在匹配的分区中进行,所以即使表中总的记录数
很多但是也不会影响sql的性能。

如图6所示,对存储的数据分段划分在多个分区位置存放,包括:利用mysql定时器
定时执行按天分区,每天到达规定时间时触发执行函数新建分区,接下来一天的数据将存
入该分区内。

首先,设置每天分区时间;

然后,当到达每天分区时间时,触发执行函数新建分区,将当天的数据将存入该分
区内,将数据分段划分在多个位置存放,分区后表面上还是一张表,但数据散列到多个位
置。

具体的,当判断到达每天分区时间,查出表的最大分区并得到最大分区时期;修改
表,并在最大分区后面增加一个分区,时间范围增加一天;拼接修改表的指令,然后执行指
令;执行完成后,销毁指令。

(1)按天分区的实现方法

1.建表结构,并创建分区情况


2.实现添加分区存储过程的方法

①到系统表查出这个表的最大分区,得到最大分区的日期的实现方法

SELECT REPLACE(partition_name,'p',”)INTO@P12_Name FROM INFORMATION_
SCHEMA.PARTITIONS

WHERE table_name='history_data'ORDER BY partition_ordinal_position
DESC LIMIT 1;

②修改表,在最大分区的后面增加一个分区,时间范围加1天

SET@Max_date=DATE(DATE_ADD(@P12_Name+0,INTERVAL 1DAY))+0;

SET@Max_date1=DATE(DATE_ADD(@Max_date+0,INTERVAL 1DAY))+0;

③拼接修改表的指令

SET@s1=CONCAT('ALTER TABLE history_data ADD PARTITION(PARTITION p',@
Max_date,'VALUES LESS THAN(TO_DAYS(”',DATE(@Max_date1),”')))');

3.定时事件,按每天执行的实现方法


(2)分表

分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,可称
为子表,这些子表可以分布在同一块磁盘上,也可以在不同的机器上,读写的时候根据事先
定义好的规则得到对应的子表名,然后去操作它。

利用定时器按月分表,将每月的表格都单独区分开,到达每月设定时间时将旧表
格重新命名并新建表格存储接下来的数据。

例如,假设有一个表名为test表,今天是11月29号,平时插入或者更新的数据都存
在这个表中,到了下个月1号凌晨,就test表重新命名为test_11,并自动创建一个新表名为
test,这样12月的数据又插入到这个新的test空表中,数据库如此设计可方便查询数据,同
样方便数据库的管理。

如图7所示,将数据所在的大表定时分成多个多张具有独立存储空间的实体子表,
包括:

首先,设置每月分表时间;

然后,将每月的表格都单独区分开,到达每月设定时间时将旧表格重新命名并新
建表格存储接下来的数据,将一个大表按照一定的规则分解成多张具有独立存储空间的实
体子表。

具体的,当判断达到每月分表时间,重新命名表;仅对表结构进行复制,但不复制
数据;拼接修改表的指令,然后执行指令;执行完成后,销毁指令。

按月分表的实现方法

1.存储过程的实现方法

①重新命名表

set newtablename=

concat(tablename,'_',year(curdate()),'_',month(curdate())-1);

set@s1=concat('rename table',tablename,'to',newtablename);

②只复制表结构,不复制数据

set@s2=concat('create table',tablename,'like',newtablename);

prepare stmt from@s2;

execute stmt;

deallocate prepare stmt;

commit;

2.定时事件,按每月执行的实现方法


根据本发明实施例的高速数据库设计方法,首先利用Redis缓存将采集的数据实
时存入缓存内,再将缓存内的数据集中访问并批量存入数据库,缓存内的数据可供平台展
示。本发明采用通过状态码进行判断处理缓存剩余数据技术、数据库的定时按天分区按月
分表管理技术、定时生成表名技术和定时批量打包数据技术,能够处理大批量数据的存储,
大大加快了数据存储的效率,能够将平台界面和后台数据处理有效结合,有效避免数据丢
失的情况,并定时按天分区按月分表管理数据库。

在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示
例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特
点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不
一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何
的一个或多个实...

=>>详细说明书全文请进入首页检索查看

图1
©2018 IPPH.cn   PatViewer·专利搜索
主办单位:知识产权出版社有限责任公司  咨询热线:01082000860-8588
浏览器:IE9及以上、火狐等  京ICP备09007110号 京公网安备 11010802026659号