通过管道传输pipe将MySQL数据批量导入Redis
      自Redis 2.6以上版本起,Redis支持快速大批量导入数据,即官网的Redis Mass Insertion,即Pipe传输,
通过将要导入的命令转换为Resp格式,然后通过MySQL的concat()来整理出最终导入的命令集合,以达到快速导入的目的。 

1. 根据需求设计好Redis的hash结构,关键是Key的设计

Redis其实就是内存数据库,而其中最常用的就是hash结构,key-value,查询时需要使用到key,所以key的设计决定了查询的效率,

而你的需求则决定了你的key如何设计,这里推荐一个例子:浅谈REDIS数据库的键值设计

建表语句:

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;

key的一般定义格式为: 表名:主键值:列名   不是硬性要求

所以我们这里的key设置为 person:id

2.确定使用的Redis命令

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

HMSET myhash field1 "Hello" field2 "World"

3. 最终处理的结果如下:

    特别注意:因为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 hval3From 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 hval3From person
)AS t

命令解释:

最终的命令由两部分组成,红色框是将MySQL的数据select出来,为了方便都是用了别名(细心的你会发现,这些别名在紫色框中被引用),

紫色框引用了select出来的数据,然后转换成符合RESP协议格式:

第一行的 *8\r\n  :  *表示数组,8表示数组元素个数, \r\n是规定分隔符

第二行的  '$',LENGTH(redis_cmd),'\r\n',redis_cmd,'\r\n',     : $表示长字符串,LENGTH(redis_cmd)表示字符串长度,redis_cmd字符串变量,\r\n还是规定字符串

通过数数,发现这样的长字符串有8个,都是外面数组的元素

所以,这一堆很难懂的东西表示,一个包含8个字符串的数组的一个Redis命令,

内容如下:

    *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

特别特别注意

1、根据RESP协议,长字符串(bulk Strings)的格式要求是$字符长度\r\n字符串\r\n的,但是从上面命令的最后一行可以看到,

      在Linux下,最后变成了\r,而在Windows下就直接什么都没有了。

2、上图中箭头指向处,'\r\n'后面这个逗号,可以可无,如果没有逗号,一定要空一格空格,否则出错。

4.运行命令,进行数据导入

将第三步的命令保存到文件中,这里是person.sql

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

  或:

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

其中:

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

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

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

| 管道符号(意思是将该符号左边的运算结果提交给右边的命令处理,这里是先通过MySQL到处数据,然后用redis-cli导入到Redis)

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

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

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

  Last reply received from server.

  errors: 0, replies: 2

可以打开 Redis-cli 输入dbsize或者keys *命令来进行查询。

5. 错误异常处理

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

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

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

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

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

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

参考:http://baijian.github.io/2013/10/12/import-data-from-mysql-to-redis.html

通过管道传输快速将MySQL的数据导入Redis相关推荐

  1. 通过管道传输快速将MySQL的数据导入Redis(自己做过测试)

    通过管道传输快速将MySQL的数据导入Redis 通过管道传输pipe将MySQL数据批量导入Redis       自Redis 2.6以上版本起,Redis支持快速大批量导入数据,即官网的Redi ...

  2. mysql导入数据表越来越慢,快速解决mysql导数据时,格式不对、导入慢、丢数据的问题...

    快速解决mysql导数据时,格式不对.导入慢.丢数据的问题 如果希望一劳永逸的解决慢的问题,不妨把你的mysql升级到mysql8.0吧,mysql8.0默认的字符集已经从latin1改为utf8mb ...

  3. mysql表导入redis_MySQL数据导入Redis

    参考资料: http://www.ttlsa.com/database/mysql_data_will_be_migrated_to_redis/http://blog.csdn.net/stubbo ...

  4. 用sqoop将mysql的数据导入到hive表中,原理分析

    Sqoop 将 Mysql 的数据导入到 Hive 中 准备Mysql 数据 如图所示,准备一张表,数据随便造一些,当然我这里的数据很简单. 编写命令 编写参数文件 个人习惯问题,我喜欢把参数写到文件 ...

  5. 将oracle数据库中的数据导入redis数据库演示

    1.首先我们先创建一个sql文件,文件名为 aa.sql ,sql语句如下所示.第一个spool后面跟着的 /opt/dt.txt ,表示将oracle执行后生成的可用于redis读取的语句存放在此文 ...

  6. [整理]MySql批量数据导入Load data infile解决方案

    有时候我们需要将大量数据批量写入数据库,直接使用程序语言和Sql写入往往很耗时间,其中有一种方案就是使用MySql Load data infile导入文件的形式导入数据,这样可大大缩短数据导入时间. ...

  7. Mysql大批量数据导入ElasticSearch

    注:笔者环境 ES6.6.2.linux centos6.9.mysql8.0.三个节点.节点内存64G.八核CPU 场景: 目前Mysql 数据库数据量约10亿,有几张大表1亿左右,直接在Mysql ...

  8. sp MySQL 导入_mysql数据导入redis

    先编写sql脚本,查询好需要导入redis的数据,同时在脚本中设定好redis的类型:最外层的查询需要设定好查询的字段数量,key value各算一个. 我用的是hash结构,将表明以key的形式存储 ...

  9. mysql导入数据比原来多_Oracle和MySQL的数据导入,差别为什么这么大

    经常会有一些朋友咨询我一些数据库的问题,我注意到一个很有意思的现象,凡是数据导入的问题,基本上都是Oracle类的,MySQL类的问题脑子里想了下竟然一次都没有. 我禁不住开始思考这个未曾注意的问题: ...

最新文章

  1. java 做登录跳转404_springboot 访问路径错误跳转到404(实现方法一)
  2. 请教,一个解决方案中包含多个相互引用的项目,该如何配置?
  3. SaaS服务在未来云计算中该如何发展
  4. Python包的相对导入时出现问题解决
  5. 在 IntelliJ IDEA 中创建基本的 Maven 多模块项目
  6. Android牟利之道(一)--界面嵌入有米广告
  7. 让我们用jOOλ在Java 8中流式传输地图
  8. java连接oracle失败_程序连接oracle数据库失败
  9. java实现订单物品计算佣金,java三角形、NextDay、佣金问题代码
  10. 编程机器人哪家好?灵跃模组机器人硬核评测!
  11. 简述无人驾驶感知功能
  12. Hibernate的session一级缓存
  13. 5.1 Lilypond五线谱
  14. html显示等宽字体
  15. zotero word 调整样式 上标
  16. plc与计算机通信方式,PLC通信方式介绍
  17. day-9 字符串笔记
  18. mysql筛选两个不同表的数据
  19. oracle12c rac恢复,oracle 12c rac恢复votedisk碰到问题了(asm)
  20. 安全帽识别系统的应用鹰眸视频分析

热门文章

  1. python中的matlibplot_python中如何用matlibplot画时间序列图?
  2. leetcode刷题:不同路径
  3. 计算机机培训论文,一篇文章了解机器学习
  4. linux设置组配置额步骤,linux 中磁盘配额设置
  5. 符号库匹配不对的原因_整理了几种离合器打滑的原因,再安装调试时可别弄错了...
  6. pytorch torch.nn.TransformerEncoderLayer
  7. 网络通信 public ip 和 private ip
  8. BaseAudioContext
  9. 编程语言对比 异常处理
  10. Numpy Mathematical functions 数学函数