我们使用redis提供的Pipe的方式将mysql中数据导入到redis中
create database test;
create table user(
id int not null,
password varchar(12),
name varchar(20),
phone varchar(11)
);
insert into user values(1,'password1','lipgqiag','18811659586');
insert into user values(2,'password2','zhujingb','18812439876');
insert into user values(3,'password3','xuegmeg','15267424792');
本例中我们使用Hash结构来存储mysql中数据,表明:主键名作为key,其他字段作为field:value
SELECT CONCAT(
"*8\r\n", -- *表示数组,8表示数组元素个数*,\r\n是linux中分隔符,8这个数字根据下面红底字段数量进行调整
'$', LENGTH(redis_cmd), '\r\n', redis_cmd, '\r\n', --$表示长字符串,LENGTH(redis_cmd)表示字符串长度,redis_cmd字符串变量
'$', 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('user:id:' ,id) AS redis_key,
'password' AS hkey1, password AS hval1,
'name' AS hkey2, name AS hval2,
'phone' AS hkey3, if(phone is not null, phone, '') AS hval3
FROM user
) AS t;
以上脚本在mysql中执行后的输出如下:
*8
$5
HMSET
$9
user:id:1
$8
password
$9
password1
$4
name
$12
liupengqiang
$5
phone
$11
18811459586
*8
$5
HMSET
$9
user:id:2
$8
password
$9
password2
$4
name
$10
zhujiangbo
$5
phone
$11
18812439876
*8
$5
HMSET
$9
user:id:3
$8
password
$9
password3
$4
name
$10
xumengmeng
$5
phone
$11
15230424792
由于与redis服务通信要遵守RESP协议规范,协议如下:
客户端以规定格式的形式发送命令给服务器;
服务器在执行最后一条命令后,返回结果。
客户端可以发送的数据类型有以下5种:
间隔符号,在Linux下是\r\n,在Windows下是\n
格式:+ 字符串 \r\n
字符串不能包含 CR或者 LF(不允许换行)
eg: "+OK\r\n"
注意:为了发送二进制安全的字符串,一般推荐使用后面的 Bulk Strings类型
格式:- 错误前缀 错误信息 \r\n
错误信息不能包含 CR或者 LF(不允许换行),Errors与Simple Strings很相似,不同的是Erros会被当作异常来看待
eg: "-Error unknow command 'foobar'\r\n"
格式:: 数字 \r\n
eg: ":1000\r\n"
格式:$ 字符串的长度 \r\n 字符串 \r\n
字符串不能包含 CR或者 LF(不允许换行);
eg: "$6\r\nfoobar\r\n" 其中字符串为 foobar,而6就是foobar的字符长度
"$0\r\n\r\n" 空字符串
"$-1\r\n" null
格式:* 数组元素个数 \r\n 其他所有类型 (结尾不需要\r\n)
注意:只有元素个数后面的\r\n是属于该数组的,结尾的\r\n一般是元素的
eg: "*0\r\n" 空数组
"*2\r\n$2\r\nfoo\r\n$3\r\nbar\r\n" 数组包含2个元素,分别是字符串foo和bar
"*3\r\n:1\r\n:2\r\n:3\r\n" 数组包含3个整数:1、2、3
"*5\r\n:1\r\n:2\r\n:3\r\n:4\r\n$6\r\nfoobar\r\n" 包含混合类型的数组
"*-1\r\n" Null数组
"*2\r\n*3\r\n:1\r\n:2\r\n:3\r\n*2\r\n+Foo\r\n-Bar\r\n" 数组嵌套,外层数组包含2个数组,整理后如下:
"*2\r\n
*3\r\n:1\r\n:2\r\n:3\r\n
*2\r\n+Foo\r\n-Bar\r\n"
mysql -h localhost -uroot -p123456 test --default-character-set=utf8 --skip-column-names --raw < /home/lpq/order.sql | /usr/local/redis-5.0.5/bin/redis-cli -h localhost -p 6379 -a 12345 --pipe
#-h host -uroot -p123456 test 分别为:mysql远程地址,用户名,密码,数据库名
#/usr/redis/order.sql | /usr/redis/redis-cli 分别为sql文件和redis客户端文件目录的地址
#-h host -p 6379 -a 123456 分别为redis远程地址,端口,密码
#–raw: 使mysql不转换字段值中的换行符。
#–skip-column-names: 使mysql输出的每行中不包含列名。