Redis数据导入导出以及数据迁移的4种方法详解

1、aof 导入方式。

因为这种方式比较简单,所以我就先介绍它。

分两步来实现,第一步先让源 Redis 生成 AOF 数据文件。

# 清空上文目标实例全部数据
redis-cli -h 目标RedisIP -a password flushall
# 源实例开启 aof 功能,将在 dir 目录下生成 appendonly.aof 文件
redis-cli -h 源RedisIP -a password config set appendonly yes

dir 目录,可以通过 config get dir 目录获得。

config get dir
# 比如我的 Mac 上执行上面的命令后,返回如下内容
1) "dir"
2) "/usr/local/var/db/redis"

通过上面的命令,我们可以看到我本地的 dir 目录是:/usr/local/var/db/redis。

现在我们来做第二步操作,让目标 Redis 实例导入 aof 数据。

# 将 appendonly.aof 文件放在当前路径下
redis-cli -h 目标RedisIp -a password --pipe < appendonly.aof
# 源实例关闭 aof 功能
redis-cli -h 源RedisIp -a password config set appendonly no

上面的第一个命令,执行后,如果出现以下内容,则表示导入 aof 数据成功。

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

我这里是测试,数据比较少,所以提示有 5 个导入成功了。

AOF 的缺点也很明显,就是速度慢,并且如果内容多的话,文件也比较大。而且开启 AOF 后,QPS 会比 RDB 模式写的 QPS 低。还有就是 AOF 是一个定时任务,可能会出现数据丢失的情况。

2、通过我的 xttblog_redis_mv.sh 脚本来实现。

我的脚本内容如下:

#!/bin/bash

#redis 源ip
src_ip=192.168.1.4
#redis 源port
src_port=6379

#redis 目的ip
dest_ip=127.0.0.1
#redis 目的port
dest_port=6389

#要迁移的key前缀
key_prefix=

i=1

redis-cli -h $src_ip -p $src_port -a password keys "${key_prefix}*" | while read key
do
  redis-cli -h $dest_ip -p $dest_port -a password del $key
  redis-cli -h $src_ip -p $src_port -a password --raw dump $key | perl -pe 'chomp if eof' | redis-cli -h $dest_ip -p $dest_port -a password -x restore $key 0
  echo "$i migrate key $key"
  ((i++))
done

大家在使用的时候,只需要替换 IP 即可。

这个脚本同样有一个问题就是使用了 keys *,然后一个一个遍历,如果是生产环境,不建议这样使用!当然我的脚本也是可以再进行优化的!

3、使用 redis-dump 工具。

Redis-Dump 是一个用于 Redis 数据导入 / 导出的工具,是基于 Ruby 实现的,可以方便的进行 redis 的数据备份。这个工具需要先安装,以我的 Mac 为例,安装教程如下:

# 没安装 ruby 的话,先安装 ruby
brew install ruby
# 移除 gem 自带源
gem sources --remove https://rubygems.org/
# 添加淘宝源
gem sources -a https://ruby.taobao.org/
# 安装 redis-dump
gem install redis-dump -V

目前我发现,淘宝的镜像已经出现 bad response Not Found 404 了,被告知镜像维护站点已迁往 Ruby China 镜像。

# 替换镜像地址
gem sources --add http://gems.ruby-china.org/ --remove http://rubygems.org/
# 确认镜像地址是否替换成功
gem sources -l
# 替换成功后再安装 redis-dump
gem install redis-dump -V

安装完成后,就可以使用 redis-dump 工具进行数据的导入导出了!

# redis-dump 导出
redis-dump -u :password@源RedisIp:6379 > 源Redis数据文件.json
# redis-load 导入
cat 源Redis数据文件.json | redis-load -u :password@目标RedisIp:6379

cat 源Redis数据文件.json | redis-load -u :password@目标RedisIp:6379

Linux 系统或者 Window 系统也都类似,安装 redis-dump 工具完成后直接使用 redis-dump 导出,redis-load 导入即可完成数据的备份与迁移。

redis-dump 工具很强大,建议大家到官网上多看看它的官方文档。

4、rdb 文件迁移

redis-dump 麻烦就麻烦在需要进行安装,如果我的 Redis 已经有备份机制,比如有 rdb 文件,那么我们直接迁移 rdb 文件就可以达到同样的目的。

首先,我们可以先关闭源 Redis 实例的 aof 功能。如果不关闭 aof,Redis 默认用 aof 文件来恢复数据。

# 源实例关闭 aof 功能
redis-cli -h 源RedisIp -a password config set appendonly no

然后使用 save 命令把数据固化到 rdb 文件中。

# 固化数据到 RDB 文件
save

save 完成后,还是通过 config get dir 命令获得保存的 RDB 数据文件位置。

接下来,我们需要杀死 redis 进程。杀掉当前 redis 的进程,否则下一步的复制 rdb 文件,rdb 处于打开的状态,复制的文件,会占用同样的句柄。

kill -9 redis
# 或者
pkill -9 redis
# 或者手段关闭 Redis 服务

然后复制源 redis 的 rdb 文件到目标 Redis 的 dir 数据目录,名字为你要迁移的 redis 的 rdb 文件名。

复制完成后,重启目标 Redis 实例,数据就迁移完成了。 重启完成后可以验证一下数据是否成功的复制了。

更多关于Redis数据导入导出以及数据迁移的方法请查看下面的相关链接

(0)

相关推荐

  • php实现redis数据库指定库号迁移的方法

    本文实例讲述了php实现redis数据库指定库号迁移的方法,分享给大家供大家参考.具体如下: redis普通的数据库迁移,只能整个redis save,或者利用主从,当然也可以安装一个redis-dump,不过比较麻烦,这里提供一种php的脚本,实现指定库号的迁移,其实也就是遍历根据存储类型,读出来,插入新库,效果是这样: 复制代码 代码如下: [root@localhost ~]# php 1.php 1/407 101/407 201/407 301/407 401/407 PHP实例代码如

  • Redis源码解析:集群手动故障转移、从节点迁移详解

    一:手动故障转移 Redis集群支持手动故障转移.也就是向从节点发送"CLUSTER  FAILOVER"命令,使其在主节点未下线的情况下,发起故障转移流程,升级为新的主节点,而原来的主节点降级为从节点. 为了不丢失数据,向从节点发送"CLUSTER  FAILOVER"命令后,流程如下: a:从节点收到命令后,向主节点发送CLUSTERMSG_TYPE_MFSTART包:          b:主节点收到该包后,会将其所有客户端置于阻塞状态,也就是在10s的时间内

  • redis中使用redis-dump导出、导入、还原数据实例

    redis的备份和还原,借助了第三方的工具,redis-dump 1.安装redis-dump 复制代码 代码如下: [root@localhost tank]# yum install ruby rubygems ruby-devel   //安装rubygems 以及相关包  [root@localhost tank]# gem sources -a http://ruby.taobao.org/   //源,加入淘宝,外面的源不能访问  http://ruby.taobao.org/ ad

  • 使用PHP导出Redis数据到另一个Redis中的代码

    从某个 Redis db 导出数据到另一个 Redis db 的PHP脚本: 复制代码 代码如下: $from = '127.0.0.1:6200/6';$to   = '127.0.0.1:6200/8'; $from_redis = redis_init($from);$to_redis   = redis_init($to); $keys  = $from_redis->keys('*');$count = 0;$total = count($keys);foreach($keys as

  • 从MySQL到Redis的简单数据库迁移方法

    从mysql搬一个大表到redis中,你会发现在提取.转换或是载入一行数据时,速度慢的让你难以忍受.这里我就要告诉一个让你解脱的小技巧.使用"管道输出"的方式把mysql命令行产生的内容直接传递给redis-cli,以绕过"中间件"的方式使两者在进行数据操作时达到最佳速度. 一个约八百万行数据的mysql表,原本导入到redis中需要90分钟,使用这个方法后,只需要两分钟.不管你信不信,反正我是信了. Mysql到Redis的数据协议 redis-cli命令行工具有

  • C++开发的Redis数据导入工具优化

    背景 使用C++开发了一个Redis数据导入工具 从oracle中将所有表数据导入到redis中: 不是单纯的数据导入,每条oracle中的原有记录,需要经过业务逻辑处理, 并添加索引(redis集合): 工具完成后,性能是个瓶颈: 优化效果 使用了2个样本数据测试: 样本数据a表8763 条记录: b表940279 条记录: 优化前,a表耗时11.417s: 优化后,a表耗时1.883s: 用到的工具 gprof, pstrace,time 使用time工具查看每次执行的耗时,分别包含用户时间

  • Redis数据导入导出以及数据迁移的4种方法详解

    1.aof 导入方式. 因为这种方式比较简单,所以我就先介绍它. 分两步来实现,第一步先让源 Redis 生成 AOF 数据文件. # 清空上文目标实例全部数据 redis-cli -h 目标RedisIP -a password flushall # 源实例开启 aof 功能,将在 dir 目录下生成 appendonly.aof 文件 redis-cli -h 源RedisIP -a password config set appendonly yes dir 目录,可以通过 config

  • 使用Java构造和解析Json数据的两种方法(详解二)

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包. 在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Json数据的方法

  • 使用Java构造和解析Json数据的两种方法(详解一)

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包. 在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Json数据的方法

  • Redis实现分布式锁的五种方法详解

    目录 1. 单机数据一致性 2. 分布式数据一致性 3. Redis实现分布式锁 3.1 方式一 3.2 方式二(改进方式一) 3.3 方式三(改进方式二) 3.4 方式四(改进方式三) 3.5 方式五(改进方式四) 3.6 小结 在单体应用中,如果我们对共享数据不进行加锁操作,会出现数据一致性问题,我们的解决办法通常是加锁. 在分布式架构中,我们同样会遇到数据共享操作问题,本文章使用Redis来解决分布式架构中的数据一致性问题. 1. 单机数据一致性 单机数据一致性架构如下图所示:多个可客户访

  • Android数据持久化之读写SD卡中内容的方法详解

    本文实例讲述了Android数据持久化之读写SD卡中内容的方法.分享给大家供大家参考,具体如下: 前面文章里讲的那三个方法:openFileOutput .openFileInput 虽然都能通过流对象OutputStream和InputStream可以处理任意文件中的数据,但与 SharedPreferences 一样,只能在手机内存的指定目录下建立文件,因此,在实际的开发使用中有很大的局限性,那么在这一节中,我们来看一个比较高级的方法来实现数据的持久化--读写SD卡上的内容. --读取ass

  • 利用Python代码实现数据可视化的5种方法详解

    前言 数据科学家并不逊色于艺术家.他们用数据可视化的方式绘画,试图展现数据内隐藏的模式或表达对数据的见解.更有趣的是,一旦接触到任何可视化的内容.数据时,人类会有更强烈的知觉.认知和交流. 数据可视化是数据科学家工作中的重要组成部分.在项目的早期阶段,你通常会进行探索性数据分析(Exploratory Data Analysis,EDA)以获取对数据的一些理解.创建可视化方法确实有助于使事情变得更加清晰易懂,特别是对于大型.高维数据集.在项目结束时,以清晰.简洁和引人注目的方式展现最终结果是非常

  • jQuery使用JSONP实现跨域获取数据的三种方法详解

    本文实例讲述了jQuery使用JSONP实现跨域获取数据的三种方法.分享给大家供大家参考,具体如下: 第一种方法是在ajax函数中设置dataType为'jsonp' $.ajax({ dataType: 'jsonp', url: 'http://www.a.com/user?id=123', success: function(data){ //处理data数据 } }); 第二种方法是利用getJSON来实现,只要在地址中加上callback=?参数即可 $.getJSON('http:/

  • AJAX请求数据及实现跨域的三种方法详解

    目录 传统方法的缺点: 什么是ajax? XMLHttpRequest 对象 五步使用法: 同步和异步的区别: 如何将原生ajax进行封装 JS几种跨域方法和原理 附:ajax跨域post请求的java代理实现 总结 传统方法的缺点: 传统的web交互是用户触发一个http请求服务器,然后服务器收到之后,在做出响应到用户,并且返回一个新的页面,每当服务器处理客户端提交的请求时,客户都只能空闲等待,并且哪怕只是一次很小的交互.只需从服务器端得到很简单的一个数据,都要返回一个完整的HTML页,而用户

  • Docker容器迁移到其他服务器的5种方法详解

    迁移在许多情况下都是不可避免的.硬件升级.数据中心变化.过时的操作系统,所有这些都可能成为迁移的触发点. Docker容器迁移通常是迁移任务的一部分.今天我们将看到将Docker容器从现有服务器迁移到另一台服务器的不同方法. 如何将Docker容器迁移到另一台服务器,没有直接将Docker容器从一台服务器迁移到另一台服务器的方法,我们通过使用下面这些方法中的一个或多个来解决Docker容器迁移的问题. 1.导出和导入容器 导出容器意味着从容器的文件系统创建压缩文件,导出的文件保存为"gzip&q

  • JS实现导出Excel的五种方法详解【附源码下载】

    本文实例讲述了JS实现导出Excel的五种方法.分享给大家供大家参考,具体如下: 这五种方法前四种方法只支持IE浏览器,最后一个方法支持当前主流的浏览器(火狐,IE,Chrome,Opera,Safari) <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>html 表格导出道</title> <sc

随机推荐