一种将Mysql数据批量迁移到Redis的方法与流程
- 国知局
- 2024-10-09 15:07:51
本发明属于数据处理,特别是涉及一种将mysql数据批量迁移到redis的方法。背景技术:::1、redis是一个key-value存储系统,它支持存储的value类型包括string(字符串)、list(链表)、set(集合)、zset(sortedset--有序集合)和hash(哈希类型)等。在此基础上,redis还支持各种不同方式的排序,且周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,实现主从同步,在部分场合可以对关系数据库起到很好的补充作用。python是一种跨平台的计算机程序设计语言,mysql是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。2、如中国专利cn109710485a提供一种用python语言采集mysql数据库监控数据的方法,通过python获取本主机的机器名称;将多台mysql数据库的连接信息放入一个字符串数组中;连接每一个mysql数据库,并查询数据库的各个指标,放入一个python字典中;获取mysql的监控指标,从中提取需要搜集的几个重要监控指标的值,主要包括每秒查询率、系统吞吐量、慢查询数/秒、创建总的连接数目、运行中的连接数、拒绝的连接数、缓冲池指标;计算出需要的监控指标值;将计算出的各个监控项的值整理为时序数据库的存储格式转发给监控系统即可。3、目前,从mysql迁移数据到redis中,一般也会使用shell或python编程来完成。如中国专利cn115480711a公开了一种数据迁移方法和相关装置,数据迁移系统包括数据迁移单元,数据迁移单元包括一个线程管理器、至少一个数据读取器和至少一个数据写入器。线程管理器获取源集群的磁盘带宽,根据磁盘带宽确定用于执行数据迁移的线程数量,并根据线程数量建立一个或多个线程。目标线程对应的目标数据读取器和目标数据写入器,目标数据读取器从消息队列中获取目标行键,根据目标行键从源集群中获取目标行键对应的目标待迁移数据,并向目标数据写入器发送目标待迁移数据,目标数据写入器将目标待迁移数据存储至目标集群中。4、但是,对于大批量的从多个mysql数据库迁移数据到redis集群中,而shell或其它解释型的脚本语言,无法多线程工作,大批量迁移数据会比较繁琐且耗时。技术实现思路1、本发明的目的在于提供一种将mysql数据批量迁移到redis的方法,通过主线程获取机器的cpu核数n,启动包含n个工作线程的线程池,读取配置文件信息,主线程将读取到的任务列表放入到消息队列中等,实现多线程处理任务及大批量数据迁移的处理过程,解决了现有的问题,可节省数据迁时间,提高准确性。2、为解决上述技术问题,本发明是通过以下技术方案实现的:3、本发明为一种将mysql数据批量迁移到redis的方法,包括以下步骤:4、主线程获取cpu核数n,并启动包含n个工作线程的线程池;5、主线程读取配置文件信息;所述主线程读取配置文件信息的方法为:6、主线程读取dbmanager区块名,在dbmanager区块下读取dbnum标签,得到需要访问的数据库个数m;所述主线程读取dbmanager区块名、dbnum标签、数据库个数时,若未找到dbmanager区块名或数据库个数不合理,则退出进程;7、循环拼接出区块名db_x,并在各自的区块名下获取要迁移数据的信息,其中,1≤x≤m;在读取区块名、标签名以及对应的值的过程中,如果未找到名称或值不合理,发消息优雅退出进程;8、在db_1区块名下,分别读取ip、user、passwd、dbname、tablecount对应的值,得到数据表的个数t,循环拼接出标签名tabname、columnlist、rediskeycolumn,得到数据源的表名、列名、redis键名;9、读取redis区块名,在redis区块下读取ip_port、passwd标签对应的值;在读取区块名、标签名以及对应的值的过程中,如果未找到名称或值不合理,发消息优雅退出进程;10、主线程将读取到的任务列表放入到消息队列中;11、根据数据库的个数m,使用mysql c++api建立m个mysql连接池;12、建立一个redis连接池;13、工作线程从队列中取出消息,根据mysql数据库编号,从对应的连接池中获取一个连接,并读取表结构;14、根据每个任务配置的rediskeycloumn,确定redis key的构成方式;15、工作线程从mysql数据库中读取一条记录并将记录写入到redis集群中。16、进一步地,所述主线程读取redis区块名、ip_port、passwd标签名及对应的值的过程中,若未找到redis区块名或值不合理,则退出进程。17、进一步地,所述任务列表包括mysql数据库编号、mysql表名、mysql字段名、redis键名。18、进一步地,每个所述连接池初始化时仅建立1个与mysql的连接,在处理任务时,先判断对应的连接池中是否有闲置的连接:19、若有闲置的连接时,则使用该连接来访问数据库,并将该连接的状态修改为“正在使用”,任务处理完成后,将该连接的状态改为“闲置”;20、若没有闲置的连接时,由工作线程根据任务信息中“数据库编号”得到对应的数据库连接参数;21、其中,判断对应的连接池中是否有闲置的连接的方法为:22、连接池的编号=任务信息中的数据库编号,则没有闲置的连接;23、否则,有闲置的连接。24、进一步地,所述redis连接池初始化时仅建立1个与redis集群的连接,在处理任务时,先判断redis连接池中是否有闲置的连接:25、当有闲置的连接,则使用该连接来访问redis集群,并将该连接的状态修改为“正在使用”,任务处理完成后,将该连接的状态改为“闲置”;26、当没有闲置的连接时,由工作线程根据redis集群的连接参数,使用redis c++api建立连接。27、进一步地,所述工作线程读取表结构时,如果没有可用的连接,则新建一个连接;使用mysql官网提供的c++api读取表结构,看配置的列名是否都存在,如果不存在,将错误信息输入到日志记录器。28、进一步地,所述工作线程从mysql数据库中读取记录时仅读取配置的字段;如果仅读取配置的字段成功转移到redis集群,将成功条数加1;如果失败,将失败条数加1,并将错误信息输入到日志记录器。29、进一步地,当一个任务列表的所有数据处理完成后,将统计出的mysql库名、表名、记录总条数,写redis成功的条数,写redis失败的条数;输入到日志记录器;所述日志记录器采用异步方式写日志文件。30、本发明具有以下有益效果:31、本发明通过主线程获取机器的cpu核数n,启动包含n个工作线程的线程池,主线程读取配置文件信息,将读取到的任务列表放入到消息队列中;根据数据库的个数m,建立m个mysql连接池,建立一个redis连接池;工作线程从队列中取出消息,根据mysql数据库编号,从对应的连接池中获取一个连接;使用mysql官网提供的c++api读取表结构,看配置的列名是否都存在,如果不存在,将错误信息输入到日志记录器。根据每个任务配置的rediskeycloumn,来构成redis key的构成方式;工作线程从mysql中读取一条记录,然后将这条记录写入到redis集群中。如果转移成功,将成功条数加1;如果失败,将失败条数加1,并将错误信息输入到日志记录器;实现多线程任务处理、大批量数据迁移的处理过程,节省数据迁移时间,提高准确性。32、当然,实施本发明的任一产品并不一定需要同时达到以上所述的所有优点。当前第1页12当前第1页12
本文地址:https://www.jishuxx.com/zhuanli/20241009/307745.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 YYfuon@163.com 举报,一经查实,本站将立刻删除。
下一篇
返回列表