`

快速将MySQL的数据导入Redis

 
阅读更多

参考:https://www.cnblogs.com/tommy-huang/p/4703514.html 

 

简介

通过pipe将MySQL数据批量导入Redis,自Redis 2.6以上版本起,Redis支持快速大批量导入数据,即官网的Redis Mass Insertion,即Pipe传输,
现在的业务场景是将mysql中某张表的所有数据传输到redis中存储起来。
大致思路是用MySql的concat()方法将查询出来的数据按照resp协议的格式拼接成redis命令集合,再通过redis-cli --pipe批量执行命令
 
redis存储设计
假设数据库为test,表结构如下:
create database  if not exists `test`;
use `test`;
CREATE TABLE `person` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(200) NOT NULL,
  `age` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

 考虑用hash来对mysql数据库的数据进行存储,每条数据库记录对应一条hash存储,表名+主键值为key值,列名为field值,value为对应的列值

 这里使用的是HMSET命令,格式如下:

  HMSET ‘person:id值’ field1 "Hello" field2 "World" 至于这个命令的resp格式,可以参照另外一篇文章resp 

 

sql脚本

 特别注意:因为RESP协议中的分隔符为在Linux下是\r\n,而在Windows下则为\n

  Linux下的命令为:

SELECT CONCAT(
   "*8\r\n",
   '$',LENGTH(redis_cmd),'\r\n',redis_cmd,'\r\n',
   '$',LENGTH(redis_key),'\r\n',redis_key,'\r\n',
   '$',LENGTH(hkey1),'\r\n',hkey1,'\r\n','$',LENGTH(hval1),'\r\n',hval1,'\r\n',
   '$',LENGTH(hkey2),'\r\n',hkey2,'\r\n','$',LENGTH(hval2),'\r\n',hval2,'\r\n',
   '$',LENGTH(hkey3),'\r\n',hkey3,'\r\n','$',LENGTH(hval3),'\r\n',hval3,'\r'
)FROM(
   SELECT 'HMSET' AS redis_cmd,
   concat_ws(':','person', id) AS redis_key,
   'id' AS hkey1, id AS hval1,
   'name' AS hkey2, name AS hval2,
   'age' AS hkey3, age AS hval3
   From person
)AS t

 Windows下的命令为:

SELECT CONCAT(
   "*8\n",
   '$',LENGTH(redis_cmd),'\n',redis_cmd,'\n',
   '$',LENGTH(redis_key),'\n',redis_key,'\n',
   '$',LENGTH(hkey1),'\n',hkey1,'\n','$',LENGTH(hval1),'\n',hval1,'\n',
   '$',LENGTH(hkey2),'\n',hkey2,'\n','$',LENGTH(hval2),'\n',hval2,'\n',
   '$',LENGTH(hkey3),'\n',hkey3,'\n','$',LENGTH(hval3),'\n',hval3
)FROM(
   SELECT 'HMSET' AS redis_cmd,
   concat_ws(':','person', id) AS redis_key,
   'id' AS hkey1, id AS hval1,
   'name' AS hkey2, name AS hval2,
   'age' AS hkey3, age AS hval3
   From person
)AS t

   这个查询语句最后的结果每一行都是如下的一个resp协议格式的命令:    

 *8\r\n$5\r\nHMSET\r\n$8\r\nperson:1\r\n$2\r\nid\r\n$1\r\n1\r\n$4\r\nname\r\n$5\r\nTommy\r\n$3\r\nage\r\n$2\r\n18

   然后将上面的查询语句存储到一个脚本文件比如/usr/local/person.sql

 

 调用sql脚本并执行redis命令

  mysql -uroot -ppassword dbname --default-character-set=utf8 --skip-column-names --raw < /usr/local/person.sql | redis-cli --pipe  

      其中:

      -u 是数据库用户名       -p 是数据库密码         -D 指定数据库,也可以直接输入数据库名字  

      --default-character-set=utf8 使用utf8作为默认编码

  --raw 使mysql不转换字段值中的换行符
      --skip-column-names 使mysql输出的每行中不包含列名

      | 管道符号(意思是将该符号左边的运算结果提交给右边的命令处理)          

  redis-cli 是调用Redis的客户端命令  --pipe 使用管道传输

 

  执行命令后,如果出现类似以下提示,这说明导入正确:

  All data transferred. Waiting for the last reply...

  Last reply received from server.

  errors: 0, replies: 2

 

  错误处理 

  ERR Protocol error: expected '$', got ' '

  如果执行命令时,出现 ERR Protocol error: expected '$', got ' ' , 先判断你的操作系统,

      如果是在Windows下使用了\r\n作为分隔符就会如此,应改成\n。

  ERR Protocol error: expected '$', got '1' 就是got后面的内容不为空 ' '

     看起来与5.1的错误提示极为相似,但这个一般是数据库中有特殊符号所导致的的,

    所以在命令中加上 --default-character-set=utf8 即可

  • 大小: 20.4 KB
  • 大小: 17.3 KB
分享到:
评论

相关推荐

    php将txt每行文本导入mysql数据库或redis工具插件.rar

    综上所述,这个工具包是一个实用的PHP解决方案,用于高效地将文本数据导入到MySQL数据库或Redis中,适合需要大量数据处理的Web开发者。通过使用mysqli和Redis,它能够提供快速、灵活的数据存储和检索能力。

    springboot+mysql+redis集成Demo

    在本项目"springboot+mysql+redis集成Demo"中,我们将探讨如何将Spring Boot框架与MySQL数据库和Redis缓存服务进行整合,以实现一个高效、可扩展的应用程序。以下是对这个集成过程的关键知识点的详细说明。 1. **...

    Vue+SpringBoot+MySQL+redis课堂派前后端分离_redis集群读写分离

    接着,利用MySQL的Sql文件导入数据库结构和初始数据。对于Redis集群,你需要配置至少三个节点,一个为主节点,其余为从节点,确保读写分离的配置正确。前端部分,Vue项目可以通过npm或yarn进行安装依赖并运行,生成...

    golang路由,集成mysql,redis。读取配置文件信息

    在本文中,我们将深入探讨如何使用Golang来构建一个包含路由转发、MySQL集成以及Redis连接的应用。我们将重点关注Golang的特性,如路由处理、数据库连接、并发处理(goroutines)以及通道(chan)的使用。 首先,让...

    从MySQL到Redis的简单数据库迁移方法

    在案例中,一个包含约800万行数据的MySQL表,通过常规方法导入Redis需要90分钟,而使用管道输出的方式仅需两分钟,显著提升了效率。 在具体操作中,首先需要对MySQL的数据进行格式转换,使其符合Redis的批量插入...

    Redis-PipeLine批量导入.docx

    在处理大量数据导入时,为了提高效率,Redis 提供了一种称为 Pipeline 的技术,允许一次性发送多条命令,减少网络通信的开销。批量导入数据可以显著提升数据处理速度,尤其在需要初始化大量数据或进行数据迁移时。 ...

    springboot_mysql_redis_socket通信量子件_excel导入_

    在本项目中,我们主要探讨的是如何利用SpringBoot框架实现Excel数据的导入导出功能,同时结合MySQL数据库和Redis缓存技术。以下是关于这些技术及其整合应用的详细讲解。 首先,SpringBoot是Spring框架的一个轻量级...

    grafana-dashboard-mysql-redis-web.zip

    导入后,Grafana将自动从Prometheus获取数据并展示在图表上。这些预设的模板简化了监控系统的设置过程,让运维团队可以快速有效地监控和分析系统性能。 总的来说,"grafana-dashboard-mysql-redis-web.zip"提供的...

    DB服务器使用mysql和redis高可用框架干货

    每次启动redis,使用管道技术,从mysql批量导入活跃用户数据到redis中,并设置过期时间.4、教程使用线程池技术,每个线程拥有自己独立的数据,线程绑定类。每一个实例就包含一个线程每个线程数据里包含:mysql连接器、...

    storm+kafka+redis+mysql

    在storm+kafka+redis+mysql架构中,Redis可能扮演数据缓冲的角色,接收Storm处理后的结果,提供快速查询服务。此外,Redis的订阅/发布功能也可用于实时通信,例如将处理结果推送给其他系统或者应用。 **MySQL** ...

    rediscluster.rar

    1. **数据同步**:可以使用工具如`redis-trib.rb`的`--import-from-mysql`选项,或者编写脚本,定期将MySQL中的数据导入Redis Cluster。此外,可以利用`Redis Pipeline`或`Transaction`批量操作,提高导入效率。 2....

    redis.rar单机版redis,使用MySQL数据库,里面有批处理的SQL,性能十分卓越,单机版经供参考,抛转引玉

    在提供的压缩包中,可能存在这样的SQL脚本,帮助用户快速导入或初始化数据,这对于快速设置测试环境或演示系统非常有用。 Redis的数据结构丰富多样,如字符串、哈希、列表、集合和有序集合,这使得Redis能灵活地...

    win10 Redis&MySQL57 服务

    这些.reg文件可能是用来导入到注册表的脚本,以帮助用户快速配置MySQL 57和Redis作为Windows服务。使用时,用户需谨慎操作,因为不正确的注册表修改可能导致系统不稳定或功能缺失。 在配置Redis服务时,用户需要将...

    grafana-mysql-linux-redis-springbootJson指标包

    【标题】"Grafana-MySQL-Linux-Redis-SpringBootJson指标包"是一个综合性的监控解决方案,旨在帮助用户高效地...在实际使用时,需要确保Grafana已配置好与MySQL、Prometheus以及Redis的连接,以便正确展示和解析数据。

    window上安装的Redis可视化管理软件

    5. **备份和导入**:支持导出Redis数据到文件,以及从文件导入数据,方便备份和恢复操作。 6. **事务管理**:可以创建和执行Redis事务。 7. **搜索和过滤**:提供搜索功能,帮助用户快速找到特定的键,还可以设置...

    redis_mysql

    2. **MySQL脚本操作**:包括如何创建和运行SQL脚本,以及如何进行数据导入导出。例如,`mysqldump`命令用于数据库备份,`source`命令可以用来执行SQL脚本。 3. **Redis的数据结构**:理解Redis提供的五大数据类型...

    Excel_To_DB:一款将Excel表格中的数据导入至数据库中的小工具,SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库

    4. **异步导入**: 异步处理机制是通过将数据导入操作从主线程中分离出来,让主线程可以立即返回,而数据导入工作在后台线程中进行。这种方式可以提升用户体验,因为用户不需要等待整个导入过程完成就可以继续其他...

    Navicat是一款功能强大的数据库管理工具,它支持多种数据库系统,包括MySQL、Redis、Oracle、PostgreSQ

    数据导入和导出:Navicat提供了灵活的数据导入和导出功能,使用户能够轻松地将数据从一个数据库系统导入到另一个数据库系统,或将数据导出为不同的文件格式。 数据同步和备份:Navicat支持在不同的数据库之间进行...

Global site tag (gtag.js) - Google Analytics