Mysql百万级数据量级下,如何高效的迁移到Redis?

(2)端口的扫描,nc可以作为client发起TCP或UDP连接

(3)机器之间传输文件

(4)机器之间网络测速

11561958-a97c8dba00ae9bd2

11561958-4fe00e8ef70848fd

采用pipe模式导入数据

然而,使用nc监听并不是一个非常可靠的方式来执行大规模的数据导入,因为netcat并不真正知道何时传输了所有数据,也无法检查错误。在2.6或更高版本的Redis中,Redis -cli脚本支持一种称为pipe管道模式的新模式,这种模式是为了执行大规模插入而设计的。

使用管道模式的命令运行如下:

11561958-3aac995080f49ed2

由上图,可以看到pipe命令的返回结果,txt文件中有多少行命令,返回的replies数就是多少,

errors表示其中执行错误的命令条数。

redis协议学习

协议的格式为:

*<参数数量> \r\n

$<参数 1 的字节数量> \r\n

<参数 1 的数据> \r\n

$<参数 N 的字节数量> \r\n

<参数 N 的数据> \r\n

比如:

插入一条hash类型的数据。

HSET id book1 book_description1

根据Redis协议,总共有4个部分,所以开头为*4,其余内容解释如下:

| 内容 | 长度 | 协议命令 |

| — | — | — |

| HSET | 4 | $4 |

| id | 2 | $2 |

| book1 | 5 | $5 |

| book_description1 | 17 | $17 |

注意一下:HSET命令本身也作为协议的其中一个参数来发送。

构造出来的协议数据结构:

*4\r\n$4\r\nHSET\r\n$2\r\nid\r\n$5\r\nbook1\r\n$17\r\nbook_description1\r\n

格式化一下:

*4\r\n

$4\r\n

HSET\r\n

$2\r\n

idvvvv\r\n

$5\r\n

book1\r\n

$17\r\n

book_description1\r\n

RESP协议 bulk

Redis客户机使用一种称为RESP (Redis序列化协议)的协议与Redis服务器通信。

redis-cli pipe模式需要和nc命令一样快,并且解决了nc命令不知道何时命令结束的问题。

在发送数据的同时,它同样会去读取响应,尝试去解析。

一旦输入流中没有读取到更多的数据之后,它就会发送一个特殊的20比特的echo命令,标识最后一个命令已经发送完毕

如果在响应结果中匹配到这个相同数据后,说明本次批量发送是成功的。

使用这个技巧,我们不需要解析发送给服务器的协议来了解我们发送了多少命令,只需要解析应答即可。

在解析应答时,redis会对解析的应答进行一个计数,在最后能够告诉用户大量插入会话向服务器传输的命令的数量。也就是上面我们使用pipe模式实际操作的响应结果。

将输入数据源换成mysql

上面的例子中,我们以一个txt文本为输入数据源,使用了pipe模式导入数据。

基于上述协议的学习和理解,我们只需要将mysql中的数据按照既定的协议通过pipe模式导入Redis即可。

实际案例–从Mysql导入百万级数据到Redis
首先造数据

由于环境限制,所以这里没有用真实数据来实现导入,那么我们就先使用一个存储过程来造一百万条数据把。使用存储过程如下:

DELIMITER $$

USE cb_mon$$

DROP PROCEDURE IF EXISTS test_insert$$

CREATE DEFINER=root@% PROCEDURE test_insert()

BEGIN

DECLARE i INT DEFAULT 1;

WHILE i<= 1000000

DO

INSERT INTO t_book(id,number,NAME,descrition)

VALUES (i, CONCAT(“00000”,i) , CONCAT(‘book’,i)

, CONCAT(‘book_description’,i));

SET i=i+1;

END WHILE ;

COMMIT;

END$$

DELIMITER ;

调用存储过程:

CALL test_insert();

查看表数据:

按协议构造查询语句

按照上述redis协议,我们使用如下sql来构造协议数据

SELECT

CONCAT(

“*4\r\n”,

“$”,

LENGTH(redis_cmd),

“\r\n”,

redis_cmd,

“\r\n”,

“$”,

LENGTH(redis_key),

“\r\n”,

redis_key,

“\r\n”,

“$”,

LENGTH(hkey),

“\r\n”,

hkey,

“\r\n”,

“$”,

LENGTH(hval),

“\r\n”,

hval,

“\r”

)

FROM

(SELECT

“HSET” AS redis_cmd,

id AS redis_key,

NAME AS hkey,

descrition AS hval

FROM

cb_mon.t_book

) AS t limit 1000000

并将内容保存至redis.sql 文件中。

编写脚本使用pipe模式导入redis

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

分享

首先分享一份学习大纲,内容较多,涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:

(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构…实在是太多了)

其次分享一些技术知识,以截图形式分享一部分:

Tomcat架构解析:

算法训练+高分宝典:

Spring Cloud+Docker微服务实战:

最后分享一波面试资料:

切莫死记硬背,小心面试官直接让你出门右拐

1000道互联网Java面试题:

Java高级架构面试知识整理:

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
存中…(img-4GOg567w-1713509284599)]

Spring Cloud+Docker微服务实战:

[外链图片转存中…(img-LgON50qj-1713509284600)]

最后分享一波面试资料:

切莫死记硬背,小心面试官直接让你出门右拐

1000道互联网Java面试题:

[外链图片转存中…(img-GNajfANS-1713509284601)]

Java高级架构面试知识整理:

[外链图片转存中…(img-Ty5Ji67u-1713509284602)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值