通过管道传输快速将MySQL的数据导入Redis
自Redis 2.6以上版本起,Redis支持快速大批量导入数据,即官网的Redis Mass Insertion,即Pipe传输,
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 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
命令解释:

最终的命令由两部分组成,红色框是将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的更多相关文章
- 使用pandas把mysql的数据导入MongoDB。
使用pandas把mysql的数据导入MongoDB. 首先说下我的需求,我需要把mysql的70万条数据导入到mongodb并去重, 同时在第二列加入一个url字段,字段的值和第三列的值一样,代码如 ...
- MySQL之数据导入导出
日常开发中,经常会涉及到对于数据库中数据的导入与导出操作,格式也有很多: TXT,CSV,XLS,SQL等格式,所以,在此总结一下,省的总是百度查询. 一 导出 1) 常用的方式就是使用现成的工具例如 ...
- mysql的数据导入导出
1.Navicat for Mysql XML导出导入格式支持二进制数据:虽然同步数据人眼看不出区别,但是java尝试读取数据时,报datetime字段取出的值为“0000-00-00 00:00:0 ...
- Mysql 大量数据导入
今天试图用heidisql 导入一个150M的数据文件(.sql), 结果报out of memory 错误.在网上搜了很多案例,都没能解决问题.我甚至怀疑是mysql 的default的内存设置的太 ...
- 用sqoop将mysql的数据导入到hive表中
1:先将mysql一张表的数据用sqoop导入到hdfs中 准备一张表 需求 将 bbs_product 表中的前100条数据导 导出来 只要id brand_id和 name 这3个字段 数据存 ...
- solr 4.8+mysql数据库数据导入 + mmseg4j中文全文索引 配置笔记
转载请标明出处:http://www.cnblogs.com/chlde/p/3768733.html 1.如何将solr部署,请参考之前的文章 2.按上述配置好后,在solr_home文件夹中,将包 ...
- MySQL多线程数据导入导出工具Mydumper
http://afei2.sinaapp.com/?p=456 今天在线上使用mysqldump将数据表从一个库导入到另外一个库,结果速度特别慢,印象中有个多线程的数据导入导出工具Mydumper,于 ...
- MySQL示例数据导入
从官网下载示例数据,参考压缩文件中的README.txt,整理所得 /******************* 示例数据导入 *******************/ /** 官网下载 http://d ...
- 如何从mysql中将数据导入到sqlserver
本文讨论如何把MySQL的数据库导入到SQL Server中,所以首先你需要把两种数据库都安装了,再进行以下步骤. 一.为 MySQL安装ODBC驱动 1. 下载MySQL ODBC Connecto ...
随机推荐
- PowerDesigner Comment与Name相互替换
从name替换comment Option Explicit ValidationMode = True InteractiveMode = im_Batch Dim mdl ' the curren ...
- 比特币解锁脚本中的ScriptSignature都包含了什么东西
比特币 解锁脚本signature script 包含了那些东西? 使用 UTXO 需要私钥签名,私钥到底都签了什么东西呢?一直比较好奇. 比特币的私钥签名总共有五中类型,具体见 btcd 代码,如下 ...
- windows Win7如何设置多用户同时远程登录
windows Win7如何设置多用户同时远程登录 1.创建一个用户 密码永不过期 2.在本地组策略编辑器里面,依次展开计算机配置--->管理模板--->Windows组件---> ...
- 如何使用MySQL Workbench创建数据库存储过程
方法/步骤 1 打开My SQL Workbench 2 右击要启动的my SQL数据库连接,然后选择[connection to database] 3 此时进入数据库实例管理界面,下方显示 ...
- 全局CSS的配置
/*公共部分开始*/ ::selection{ background-color: #3095fb; color: white; } ::moz-selection{ background-color ...
- SecureCRT上传下载文件
这篇内容在哪看到的我也找不到了,不过就是做个记录. 步骤如下: 1.SecureCRT连接远程终端. 2.在连接窗口上方右击,弹出菜单后点击Connect SFTP Session, 3.点击后弹出窗 ...
- javascript中children,childNodes等节点属性
1.children与childNodes children: 获取子元素节点,无兼容问题 childnNodes: IE:获取子元素节点 非IE(chrome,Firefox等):获取子节点,包括元 ...
- (USB HID) Report Descriptor 理解
在這理整理一下基本 Report Descriptor 對於入門基礎的了解. 在很多文件.Blog都有提到HID report 總共分為3種 : Input.Output.Feature report ...
- redis 学习笔记(一)
redis 基本类型 String 基本操作: GET 获取存储在给定键中的值 SET 设置存储在给定键中的值 DEL 删除存储在给定键中的值 List 基本操作: LPUSH/RPUSH 从左/右推 ...
- StringBuffer类和String类的区别
StringBuffer是使用缓冲区的,本身也是操作字符串的,但与String类不同,String类的内容一旦声明后是不可改变的,改变的只是其内存的指向,而StringBuffer类的对象内容是可以改 ...