Mysql如何高效的迁移到Redis

2023-05-16

 

 

1.需求
前端任务需要将几百万数据某几个关键字段组合成字符串从mysql导入redis 列表中,发现网上大都数linux 以及 redis为key-value形式的hash值,而我需要的是字符串列表,找不少资料始终找不到,无奈只能自己研究了 ..希望能给到大家启发。

 

2.下载redis 并启动
这个无需多言简单介绍下 

首先去 :https://github.com/MSOpenTech/redis/releases 下载  Redis-x64-3.2.100(其他版本亦可)

然后启动 也可以解压之后打到服务里面启动 

  1.打到服务里面默认端口为6379

     redis-server --service-install redis.windows.conf --service-name RdisDb--port 6380

  2.或者cmd进入目录直接启动

     启动命令:redis-server.exe redis.windows.conf

 

3.将mysql 数据导入redis中

参考资料:http://blog.itpub.net/26515977/viewspace-1208145/

首先我的数据库格式是这样的

redis 要求的格式是这样的


*<args><cr><lf>
$<len><cr><lf>
<arg0><cr><lf>
<arg1><cr><lf>
...
<argN><cr><lf>
 
# Where <cr> means "\r" (or ASCII character 13) and <lf> means "\n" (or ASCII character 10).

举个例子


*3\r\n    #表明命令中包含的参数个数
$4\r\n    #表明第一个参数的长度
HSET\r\n   #第一个参数,注意各项关键字也都是参数
$3\r\n    #表明第二个参数的长度
AAA\r\n   #第二个参数
$4\r\n    #表明第三个参数的长度
BBB\r\n  #第三个参数

我现在需要的存入数据库的是这种格式

1.将下面sql保存为sql脚本,存入redis 目录中


SELECT CONCAT(  
  "*3\n",  
  '$', LENGTH(redis_cmd), '\n',  
  redis_cmd, '\n',  
    '$', LENGTH(redis_key), '\n',  
  redis_key, '\n',  
  
  '$', LENGTH(CONCAT("http://baike.baidu.com/item/",hval,"/",hkey)), '\n',CONCAT("http://baike.baidu.com/item/",hval,"/",hkey)  
  
)  
FROM (  
  SELECT 
  'LPUSH' as redis_cmd,  
  'ErrorUrl-data' AS redis_key,  
  newLemmaId AS hkey,  
  item AS hval  
  FROM add_doc_copy1
) AS t

上面执行出来就是这个样子 就代表成功

2.cmd进入目录执行写入命令

 

    如果  redis中设置了密码 用下面

   mysql -h 127.0.0.1 -uroot -p123456 baike_update --default-character-set=utf8 --skip-column-names --raw < mysql-to-redis.sql | redis-cli.exe -h 127.0.0.1 -p 6381 -a root --pipe

 

  如果没有密码

mysql -h 127.0.0.1 -uroot -p123456 baike_update --default-character-set=utf8 --skip-column-names --raw < mysql-to-redis.sql | redis-cli.exe --pipe

 

解释:mysql -h 127.0.0.1 -uroot -p123456 (数据库登陆)          baike_update(数据库名)    --default-character-set=utf8 (数据库有特殊符号等最好加上这句,也可以去掉 )  --skip-column-names --raw < mysql-to-redis.sql | redis-cli.exe -h 127.0.0.1 -p 6381 -a root --pipe (redi执行命令)

 

 

3.如果需要存入key-value形式的可以使用下面sql
 

SELECT CONCAT(  
  "*4\n",  
  '$', LENGTH(redis_cmd), '\n',  
  redis_cmd, '\n',  
    '$', LENGTH(redis_key), '\n',  
  redis_key, '\n',  
  '$', LENGTH(hkey), '\n',  
  hkey, '\n', 
  '$', LENGTH(CONCAT("http://baike.baidu.com/item/",hval,"/",hkey)), '\n',CONCAT("http://baike.baidu.com/item/",hval,"/",hkey)  
  
)  
FROM (  
  SELECT 
  'HSET' as redis_cmd,  
  'ErrorUrl-data' AS redis_key,  
  newLemmaId AS hkey,  
  item AS hval  
  FROM baike_update.add_doc  
) AS t

 

############################################################################################

首先造数据

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

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();

 

linux下版本

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

win下版本

SELECT
	CONCAT(
		"*4\n",
		"$",
		LENGTH(redis_cmd),
		"\n",
		redis_cmd,
		"\n",
		"$",
		LENGTH(redis_key),
		"\n",
		redis_key,
		"\n",
		"$",
		LENGTH(hkey),
		"\n",
		hkey,
		"\n",
		"$",
		LENGTH(hval),
		"\n",
		hval
	)
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 文件中。

 

脚本执行如下:

#!/bin/bashstarttime=`date +'%Y-%m-%d %H:%M:%S'`docker exec -i 899fe01d4dbc mysql --default-character-set=utf8   --skip-column-names --raw < ./redis.sql| docker exec -i 4c90ef506acd redis-cli --pipeendtime=`date +'%Y-%m-%d %H:%M:%S'`start_seconds=$(date --date="$starttime" +%s);end_seconds=$(date --date="$endtime" +%s);echo "脚本执行耗时: "$((end_seconds-start_seconds))"s"

手动执行(本地需要安装mysql和redis)

mysql -uroot -Dcb_mon --default-character-set=utf8 --skip-column-names --raw < test.sql | redis-cli -h 192.168.0.105 -p 6379  --pipe


总结

  1. redis单线程执行命令,避免了线程切换所消耗的时间,但是在超大数据量级下,其发送、响应接收的时延不可忽视。
  2. 网络nc命令的应用场景,及在数据导入时存在的缺点。
  3. redis RESP协议的理解和应用。
  4. 百万量级Mysql数据的Redis快速导入案例。

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mysql如何高效的迁移到Redis 的相关文章

  • Qt学习之路【5】:静态Qt库下SQLite数据库无法加载驱动(QSQLITE driver not loaded)

    使用的Qt库 Qt4 8 6 交叉编译工具链 xff1a arm linux gcc 4 3 6 这个问题纠结了好久 刚开始我使用的是Qt的动态库 xff0c 没有出现这个问题 现在使用的是Qt的静态库出现了这个问题 xff1a QSqlD
  • 【群晖nas】阿里域名DDNS 配置外网访问(华硕AC68U路由端口映射)

    拓扑图 友情提示 xff1a 其实 xff0c 华硕的路由是提供了免费域名的 具体步骤 确保路由器的WAN口IP为公网地址 在 路由器管理 系统设置 界面 xff0c 允许 从互联网设置RT AC88U 步骤1 高级设置 系统管理 系统设置
  • 使用"conn / as sysdba"登录时报出"insufficient privileges"错的问题

    1 xff09 conn as sysdba 的认证方式 oracle数据库的三种登录验证方式 xff1a 操作系统身份认证 密码文件认证 数据库认证 而conn as sysdba是属于操作系统认证 原理 xff1a 电脑开机时登录的用户
  • 数码管消影问题总结

    1 消影方法1 先送段选数据后送位选数据时 xff0c 需要在中间加入一条语句P0 61 0xff 作用是消影 现在来分析一下是怎样 产生影的 xff1f 当dula 61 0后锁住了P0口的数据 xff0c 即P0口仍然保持着上次的段选数
  • 【linux学习】ubuntu下挂载window共享文件

    ubuntu下挂载window共享文件实现文件共享 第一步 xff1a 将要共享的window文件夹共享 第二步 在ubuntu下进行挂载 xff0c 完整语法 xff0c 如下 xff1a 第一种方式 mount t cifs 192 1
  • ROM、SDRAM、RAM、DRAM、SRAM、FLASH 的区别

    ROM 和 RAM 指的都是半导体存储器 xff0c ROM 是 Read Only Memory 的缩写 xff0c RAM是 Random Access Memory的缩写 ROM 在系统体质供电的时候仍然可以保存数据 xff0c 而R
  • 软件开发技术文档编写规范

    在项目开发过程中 xff0c 应该按要求编写好十三种文档 xff0c 文档编制要求具有针对性 精确性 清晰性 完整性 灵活性 可追溯性 可行性分析报告 xff1a 说明该软件开发项目的实现在技术上 经济上和社会因素上的可行性 xff0c 评
  • insmod: can't insert 'led.ko': invalid module format详细解释

    insmod can 39 t insert 39 led ko 39 invalid module format 之前在Imx257学习版固件编写的驱动想直接移植imx257核心板的开发板上 以为2个板子的源码的引脚定义一样就没什么问题了
  • html媒体查询,同一个网页,在不同的条件下,使用不同的样式。

    媒体查询简述 设备 xff1a 屏幕 xff1a PC 手机端打印机屏幕阅读器 尺寸 xff1a 常见尺寸 320 420之间 响应式网页 xff1a 同一个网页 xff0c 在不同的条件下 xff0c 使用不同的样式 rem 百分比 xf
  • Anaconda3的安装和详细介绍(带图文)

    Anaconda的安装和详细介绍 xff08 带图文 xff09 Anacond的介绍 Anaconda指的是一个开源的Python发行版本 xff0c 其包含了conda Python等180多个科学包及其依赖项 因为包含了大量的科学包
  • vue项目引入less文件

    如果需要在vue项目中使用 less文件 xff0c 首先需要安装less和less loader依赖包 xff0c 这个 less文件相当于以前web项目的css文件 xff0c 有三种引入方式 xff1a 方式一 xff1a 在vue界
  • 新的开始

    这是第一次写博客 xff0c 也算是一个新的开始 今天就是写一些自己学到的内容 xff1a 今天接触了冒泡排序法 xff0c 还是能够接受的 1 init function var a 61 10 30 20 40 15 5 25 var
  • 【群晖nas】raidrive 极简教程

    1 群晖套件重心下载并配置 webDav server 2 raidrive连接群晖 xff0c 本地化使用 网盘下载 链接 xff1a https pan baidu com s 1eP9zBjlPjmL2 0MlWUlS3A 提取码 x
  • ubuntu20.04安装jenkins教程步骤-官方

    Debian Jenkins Packages Jenkins Debian Packages This is the Debian package repository of Jenkins to automate installatio
  • 编译mnistCUDNN时出错:fatal error: FreeImage.h: No such file or directory

    编译mnistCUDNN时出错 xff1a fatal error FreeImage h No such file or directory 在测试CUDNN是否正常使用时候报错 测试CUDNN8 1是否正常使用 1 在https dev
  • elementUI+MybatisPlus日期查询

    elementUI 43 MybatisPlus日期查询 1 前端设置 在el date picker组件加入value format 61 34 yyyy MM dd 34 xff0c 选择日期后 xff0c 将值自动保存为yyyy MM
  • Linux(centos7.5)下安装node.js

    Linux xff08 centos7 5 xff09 下安装node js 进入node的中文站点http nodejs cn download 并选择需要安装的版本链接 使用XShell上传到Linux中 xff0c 目录 opt so
  • typora中图片左对齐

    使用typora很久了 xff0c 但是它的图片一直是居中 xff0c 我这个人有左对齐强迫症 xff0c 想要图片左对齐 typora左对齐很简单 xff0c 打开主题的css文件 在最下面添加上如下代码 xff0c 保存后重启typor
  • Typora的引用设置多种样式

    设置引用多样式 此教程在很多人的反馈下 xff0c 有修改后有问题 xff0c 可能是版本不兼容 我下载的是 Typora version 0 10 10 xff08 beta xff09 版本 xff0c 有的人也是用此版本才修改成功的
  • MySQL安装最后一步卡死了

    今天给老师安装mysql 5 5 版本时出了问题 xff0c 老师的电脑系统为Windows7 xff0c MySQL安装版本为mysql 5 5 安装到最后一步 xff08 MySQL实例配置最后一步卡死了 xff09 xff0c 安装了

随机推荐