本文介绍下怎么样将mysql数据库数据导入redis。
【docker安装mysql】,创建test数据库,建user表,随便填入几条数据测试用,如下所示:
确定实现思路
1)、存储数据类型
hash数据类型。hset key field1 value1 field2 value2 ...,就上面这个表,以user:id为key,列名为field,具体值为value;
2)、导入数据方式
使用脚本,将mysql数据库中数据转换成RESP协议的redis命令。数据量少,直接写几个redis命令导入就行;数据量大的话,可以使用后端写个代码,将数据库数据读取再进行遍历添加到redis,但是不推荐这种方式(有兴趣的朋友也可以用这种方式实现下);redis能快速导入数据还有读取RDB和AOF持久化文件的方式,RDB文件是压缩的二进制文件,emmm,看不懂里面是啥,AOF文件里面存储的的基于RESP的redis执行命令语句,执行速度快,类似下图(*4:你可以将*理解为开始标识,4表示该命令(rpush listA b c)总共四部分组成;$5:表示命令第一部分的长度,eg:rpush的长度为5)。
具体实现
1)、脚本。
脚本命名为user.sql,作用是将mysql数据库中数据转换成RESP协议的redis命令。因为hset user:id name xxx state x由6部分组成,所以是*6。
select CONCAT('*6\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(hvalue1),'\r\n',hvalue1,'\r\n',
'$',LENGTH(hkey2),'\r\n',hkey2,'\r\n',
'$',LENGTH(hvalue2),'\r\n',hvalue2,'\r\n')
from (
select 'hset' as redis_cmd,
CONCAT('user:',id) as redis_key,
'name' as hkey1,name as hvalue1,
'state' as hkey2,state as hvalue2
from user
) as a
直接vim user.sql,放入上面sql。
[root@*** redis]# pwd
/opt/redis
[root@*** redis]# ls
00-RELEASENOTES CONTRIBUTING deps Makefile README.md runtest runtest-moduleapi sentinel.conf tests utils
BUGS COPYING INSTALL MANIFESTO redis.conf runtest-cluster runtest-sentinel src user.sql
[root@*** redis]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4f82be73af2b mysql:5.7 "docker-entrypoint.s…" 4 hours ago Up About a minute 0.0.0.0:3306->3306/tcp, 33060/tcp mysqltest
2)、导入。
导入前(正式环境进制使用keys *命令):
127.0.0.1:6379> keys *
(empty list or set)
导入命令:sudo docker exec -i 4f82be73af2b mysql -uroot -ppassword -Dtest --default-character-set=utf8 --skip-column-names --raw < user.sql | src/redis-cli -h xxx.xxx.xxx.xxx -p 6379 --pipe
[root@*** redis]# sudo docker exec -i 4f82be73af2b mysql -uroot -p****** -Dtest --default-character-set=utf8 --skip-column-names --raw < user.sql | src/redis-cli -h xxx.xxx.xxx.xxx -p 6379 --pipe
mysql: [Warning] Using a password on the command line interface can be insecure.
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 3
sudo docker exec -i 4f82be73af2b:在主机上执行容器内命令,使用docker上的mysql需要加上这个;
-uroot -ppassword:用户名密码信息;
-Dtest:定位数据库,也可以不加上-D;
--default-character-set=utf8:默认编码;
--skip-column-names:不输出列名;
--raw:保持数据的原有格式;
< user.sql:定位执行文件user.sql;
| :左边的输出为右边的输入;
src/redis-cli -h xxx.xxx.xxx.xxx -p 6379:使用redis-cli执行;
--pipe:创建管道。
导入后:
127.0.0.1:6379> keys *
1) "user:3"
2) "user:1"
3) "user:2"
127.0.0.1:6379> type user:1
hash
127.0.0.1:6379> hgetall user:1
1) "name"
2) "su"
3) "state"
4) "1"
如果有写的不对的地方,请大家多多批评指正,非常感谢!