mysql数据库数据导入redis

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/suchenbin/article/details/102620090

本文介绍下怎么样将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"

如果有写的不对的地方,请大家多多批评指正,非常感谢!

猜你喜欢

转载自blog.csdn.net/suchenbin/article/details/102620090