将 MySQL 数据高效导入 Redis

目录

1. RESP 协议

(1)RESP 协议的优点

(2)RESP 支持的 5 种数据类型

(3)RESP 的用途

(4)RESP 协议示例

2. redis-cli 的 pipe 模式

(1)pipe 模式的作用

(2)pipe 模式的使用场景

(3)pipe 模式的使用方法

(4)pipe 模式的输出

(5)pipe 模式的优点

3. 生成测试数据

4. 使用 SQL 构造导入文件

5. 编写脚本导入 Redis

参考:


1. RESP 协议

        RESP(REdis Serialization Protocol)是 Redis 的通信协议,用于客户端和服务器之间的数据传输。它简单、高效,支持多种数据类型。

(1)RESP 协议的优点

  • 高效:RESP 是二进制安全的,支持高效的数据传输。
  • 简单:格式简单,易于实现和解析。
  • 灵活:支持多种数据类型,适用于各种场景。

(2)RESP 支持的 5 种数据类型

  • 简单字符串

格式:+<字符串>\r\n
示例:+OK\r\n(表示字符串 OK)

  • 错误

格式:-<错误信息>\r\n
示例:-ERR unknown command\r\n(表示错误信息)

  • 整数

格式::<整数>\r\n
示例::1000\r\n(表示整数 1000)

  • 批量字符串

格式:$<长度>\r\n<数据>\r\n
示例:$6\r\nfoobar\r\n(表示字符串 foobar)

  • 数组

格式:*<元素数量>\r\n<元素1><元素2>...<元素N>
示例:*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n(表示数组 ["foo", "bar"])

(3)RESP 的用途

  • Redis 客户端与服务器通信:客户端发送命令,服务器返回响应。
  • 数据导入导出:用于 Redis 的数据备份和恢复。
  • 主从复制:主节点通过 RESP 协议将数据同步到从节点。

(4)RESP 协议示例

        客户端发送一个 SET 命令:

*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n

        解析:

  • *3:表示一个包含 3 个元素的数组。
  • $3\r\nSET\r\n:第一个元素是字符串 SET,长度为 3。
  • $5\r\nmykey\r\n:第二个元素是字符串 mykey,长度为 5。
  • $7\r\nmyvalue\r\n:第三个元素是字符串 myvalue,长度为 7。

        服务器返回一个成功响应:

+OK\r\n

        服务器返回一个错误响应:

-ERR unknown command\r\n

2. redis-cli 的 pipe 模式

        redis-cli 的 --pipe 模式是一种高效批量处理数据的功能,特别适合处理大规模数据。

(1)pipe 模式的作用

  • 高效批量处理:一次性发送大量命令或数据到 Redis 服务器,减少网络往返时间(RTT,Round-Trip Time),提升性能。
  • 减少开销:Redis 服务器会批量处理接收到的命令,减少每条命令的解析和响应开销。

(2)pipe 模式的使用场景

  • 大规模数据导入:适合导入数百万甚至数千万条数据。
  • 数据迁移:将数据从一个 Redis 实例迁移到另一个实例。
  • 批量命令执行:批量执行大量 Redis 命令(如 SET、INCR 等)。

(3)pipe 模式的使用方法

  • 命令格式:将 Redis 命令写入文件,每行一个命令。如示例文件 f1:
    SET key1 value1
    SET key2 value2
    INCR counter

  • RESP 格式:将 RESP 协议格式的数据写入文件。如示例文件 f2:
    *3\r\n$3\r\nSET\r\n$4\r\nkey1\r\n$6\r\nvalue1\r\n
    *3\r\n$3\r\nSET\r\n$4\r\nkey2\r\n$6\r\nvalue2\r\n

  • 通过 pipe 导入数据:使用 cat 命令将文件内容通过管道传递给 redis-cli --pipe,例如:
    cat f1 | redis-cli --pipe
    cat f2 | redis-cli --pipe

(4)pipe 模式的输出

        导入完成后,redis-cli 会显示统计信息,例如:

All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 1000

        errors 是错误数量,replies 是成功执行的命令数量。

(5)pipe 模式的优点

  • 高性能:批量发送数据,减少网络和解析开销。
  • 简单易用:只需将数据写入文件并通过管道传递即可。
  • 支持多种格式:支持命令格式和 RESP 格式。

3. 生成测试数据

use test;
create table t_book
(id int, name varchar(50), descrition varchar(50));drop procedure if exists sp_insert;
delimiter //
create procedure sp_insert(cnt int)
begindeclare s int default 1;set session autocommit=0;insert into t_book select s, concat('book',s), concat('book_description',s);while s<=cnt doinsert into t_book select n, concat('book',n), concat('book_description',n) from (select id+s n from t_book where id+s <=cnt) t;set s=s*2;end while;commit;
end;
//
delimiter ;call sp_insert(1000000);

4. 使用 SQL 构造导入文件

        将下面这个构造 RESP 内容的查询语句保存到文件 RESP.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 hvalfrom t_book) as t;

5. 编写脚本导入 Redis

        一百万数据,命令格式文件的数据导入用时 4 秒,RESP 格式文件的数据导入用时 3 秒:

# date;mysql -uroot -p123456 -h127.0.0.1 -P3306 -Dtest --default-character-set=utf8mb4 --skip-column-names --raw -e "select concat('hset ',id,' ',name,' ',descrition) from t_book" | \
> redis-cli -p 6379 -a 123456 --pipe;date;
Tue Mar  4 16:33:51 CST 2025
mysql: [Warning] Using a password on the command line interface can be insecure.
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 1000000
Tue Mar  4 16:33:55 CST 2025
#
# redis-cli -p 6379 -a 123456 flushdb
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
OK
#
# date;mysql -uroot -p123456 -h127.0.0.1 -P3306 -Dtest --default-character-set=utf8mb4 --skip-column-names --raw < RESP.sql | \
> redis-cli -p 6379 -a 123456 --pipe;date;
Tue Mar  4 16:34:19 CST 2025
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
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: 1000000
Tue Mar  4 16:34:22 CST 2025
#

参考:

MySQL百万级数据高效导入Redis

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/71435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis映射文件相关的知识点总结

mybatis映射文件相关的知识点总结 mybatis官网地址 英文版&#xff1a;https://mybatis.org/mybatis-3/index.html 中文版&#xff1a;https://mybatis.p2hp.com/ 搭建环境 /* SQLyog Ultimate v10.00 Beta1 MySQL - 8.0.30 : Database - mybatis-label *****************…

SQLAlchemy系列教程:SQLAlchemy快速入门示例项目

SQLAlchemy是与数据库交互的Python开发人员不可或缺的库。这个强大的ORM允许使用python结构进行简单的数据库操作。设置过程很简单&#xff0c;并且允许可扩展的数据库应用程序开发。本文通过入门项目完整介绍SQLAlchemy的应用过程&#xff0c;包括安装依赖包&#xff0c;创建连…

HTML + CSS 题目

1.说说你对盒子模型的理解? 一、是什么 对一个文档进行布局的时候&#xff0c;浏览器渲染引擎会根据标准之一的css基础盒模型&#xff0c;将所有元素表示为一个个矩形的盒子。 一个盒子由四个部分组成: content&#xff0c;padding&#xff0c;border&#xff0c;margin 下…

el-table 手动选择展示列

需求&#xff1a; 由于表格的列过多,用滚动条进行滚动对比数据不方便&#xff0c;所以提出&#xff0c;手动选择展示列 实现思路&#xff1a; 表格默认展示所有字段&#xff0c;每个字段通过 v-if 属性来进行判断是否显示&#xff1b;点击设置按钮图标(表格右上角&#xff0…

家政预约小程序用例图分析

在和客户进行需求沟通的时候&#xff0c;除了使用常规的问答的形式&#xff0c;我还使用图形化工具更深入的沟通。比如借助UML的用例图来开展系统分析&#xff0c;并且按照角色详细拆解了家政预约小程序的各个用例。在分析阶段思考的越多&#xff0c;沟通的越多&#xff0c;在系…

详解 scanf 和 printf(占位符、printf、scanf的返回值、printf的输出格式、scanf的输入格式)

一、printf 1.基本用法 •printf 的作⽤是将参数⽂本输出到屏幕 •printf print f &#xff0c;printf 代表输出打印&#xff0c;f代表 format &#xff08;格式化&#xff09;&#xff0c;format表⽰可以定制输出⽂本的格式,所以详细来说printf是将数据按照指定格式打印 …

爬蟲動態IP代理與數據採集穩定性

對於從事爬蟲開發的人來說&#xff0c;IP代理的使用直接影響了爬蟲的效率和穩定性。爬蟲的本質是模擬用戶訪問網站&#xff0c;通過抓取網頁內容來獲取所需數據。但大多數網站為了保護自己的數據或防止濫用&#xff0c;會設置諸如IP訪問頻率限制、登錄驗證甚至封禁等反爬蟲措施…

js之原型及原型链

如果js没有构造函数 首先不考虑构造函数这个鬼东西&#xff0c;当他不存在。 这个时候&#xff0c;创建对象的方式就是 <script type"text/javascript">var dog {name: hachi,age: 3}</script> 然后在浏览器上观察该对象&#xff0c;可以看到该对象包…

Xcode 运行真机失败

错误提示&#xff1a; iPhone xxx is not available because it is unpaired. Pair with the device in the Xcode Devices Window, and respond to any pairing prompts on the device. 处理方法&#xff1a; 把Xcode关闭&#xff0c;手机断开数据线&#xff0c;打开终端&…

BIO、NIO、AIO、Netty从简单理解到使用

Java编程中BIO、NIO、AIO是三种不同的I/O&#xff08;输入/输出&#xff09;模型&#xff0c;它们代表了不同的I/O处理方式。 Netty就是基于Java的NIO&#xff08;New Input/Output&#xff09;类库编写的一个高性能、异步事件驱动的网络应用程序框架&#xff0c;用于快速开发可…

import模块到另一个文件夹报错:ModuleNotFoundError: No module named xxx

1. 问题 打开项目文件夹my_code&#xff0c;将bb.py的函数或者类import到aa.py中&#xff0c;然后运行aa.py文件&#xff0c;可能会报错ModuleNotFoundError: No module named xxx。 ‪E:\Desktop\my_code ├── a │ ├── train.sh │ └── aa.py └── b└── b…

怎么写C#命令行参数程序,及控制台带参数案例(程序完整源码)下载

C#命令行参数解析控制台带参数编写案例&#xff08;程序完整源码&#xff09;下载链接 https://download.csdn.net/download/luckyext/90434790 在CMD命令窗口&#xff0c;输入ping 、ipconfig等这样的命令&#xff0c;大家应该都知道&#xff0c;但很多同学可能不知道怎么写…

JAVA安全—手搓内存马

前言 最近在学这个内存马&#xff0c;就做一个记录&#xff0c;说实话这个内存马还是有点难度的。 什么是内存马 首先什么是内存马呢&#xff0c;顾名思义就是把木马打进内存中。传统的webshell一旦把文件删除就断开连接了&#xff0c;而Java内存马则不同&#xff0c;它将恶…

算法 并查集

目录 前言 一 并查集的思路 二 并查集的代码分析 三 实操我们的代码 四 并查集的代码优化 总结 前言 并查集主要是用来求解集合问题的&#xff0c;用来查找集合还有就是合并集合&#xff0c;可以把这个运用到最小生成树里面 一 并查集的思路 1 并查集的相关的操作…

vulnhub靶场之【digitalworld.local系列】的development靶机

前言 靶机&#xff1a;digitalworld.local-devt-improved&#xff0c;IP地址为192.168.10.10 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.6 kali采用VMware虚拟机&#xff0c;靶机选择使用VMware打开文件&#xff0c;都选择桥接网络 这里官方给的有两种方式&…

Stiring-PDF:开源免费的PDF文件处理软件

Stiring-PDF是一款开源免费且比较好用的PDF文件处理工具。 Stiring-PDF官网网址为&#xff1a;https://www.stiringpdf.com/。Stiring-PDF是一款专业的PDF文件处理工具&#xff0c;支持Windows和macOS操作系统&#xff1b;提供丰富的PDF编辑和转换功能&#xff0c;适用于日常工…

SpringCloud系列教程(十二):网关配置动态路由

除了token以外&#xff0c;还有一个很实用的功能就是把网关的路由配置放到nacos上&#xff0c;并且修改路由配置的时候&#xff0c;网关服务可以动态的更新&#xff0c;这样我们在调整网络配置的时候&#xff0c;就不用重启服务了。所以我们需要用到两个重要的类&#xff1a;Na…

R JSON 文件

R JSON 文件 引言 在当今的数据分析和处理领域&#xff0c;R语言作为一种功能强大的统计计算和图形展示工具&#xff0c;被广泛应用于各种数据分析任务中。随着大数据时代的到来&#xff0c;数据的格式和结构变得越来越多样化。JSON&#xff08;JavaScript Object Notation&a…

ES6 特性全面解析与应用实践

1、let let 关键字用来声明变量&#xff0c;使用let 声明的变量有几个特点&#xff1a; 1) 不允许重复声明 2) 块儿级作用域 3) 不存在变量提升 4) 不影响作用域链 5) 暂时性死区 6&#xff09;不与顶级对象挂钩 在代码块内&#xff0c;使用let命令声明变量之前&#x…

如何使用 Ollama 的 API 来生成聊天

如何使用 Ollama 的 API 来生成聊天 简介 生成聊天 生成聊天的示例 加载模型 卸载模型 简介 Ollama 提供了一个 RESTful API&#xff0c;允许开发者通过 HTTP 请求与 Ollama 服务进行交互。这个 API 覆盖了所有 Ollama 的核心功能&#xff0c;包括模型管理、运行和监控。本…