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

 更新时间:2020年02月07日 08:48:25   作者:herman  
这篇文章主要介绍了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数据导入导出以及数据迁移的方法请查看下面的相关链接

相关文章

  • 基于Redis的限流器的实现(示例讲解)

    基于Redis的限流器的实现(示例讲解)

    下面小编就为大家分享一篇基于Redis的限流器的实现(示例讲解),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Redis的Zset类型及相关命令详细讲解

    Redis的Zset类型及相关命令详细讲解

    这篇文章主要介绍了Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数score,并且可以根据分数对元素进行排序,需要的朋友可以参考下
    2025-01-01
  • Redis Cluster集群收缩主从节点详细教程

    Redis Cluster集群收缩主从节点详细教程

    集群收缩的源端就是要下线的主节点,目标端就是在线的主节点,这篇文章主要介绍了Redis Cluster集群收缩主从节点详细教程,需要的朋友可以参考下
    2021-11-11
  • Redis中的数据结构跳表详解

    Redis中的数据结构跳表详解

    跳表是一种基于并联的链表结构,用于在有序元素序列中快速查找元素的数据结构,本文给大家介绍Redis中的数据结构跳表,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • Redis持久化方式之RDB和AOF的原理及优缺点

    Redis持久化方式之RDB和AOF的原理及优缺点

    在Redis中,数据可以分为两类,即内存数据和磁盘数据,Redis 提供了两种不同的持久化方式,其中 RDB 是快照备份机制,AOF 则是追加写操作机制,本文将详细给大家介绍Redis 持久化方式RDB和AOF的原理及优缺点,感兴趣的同学可以跟着小编一起来学习
    2023-06-06
  • Redis实现每日签到功能(大数据量)

    Redis实现每日签到功能(大数据量)

    在面对百万级用户签到情况下,传统数据库存储和判断会遇到瓶颈,使用Redis的二进制数据类型可实现高效的签到功能,示例代码展示了如何调用这些功能,包括当天签到、补签以及查询签到记录,PHP结合Redis二进制数据类型可有效处理大数据量下的签到问题
    2024-10-10
  • redis过期回调坑的解决

    redis过期回调坑的解决

    Redis提供了一种过期回调的机制,可以在某个键过期时触发一个回调函数,然而,在实际使用中,我们往往会遇到一些灾难性的问题,其中一个就是在使用过期回调的时候,我们可能会遭遇到无法预料的错误,本文就详细的介绍一下
    2023-09-09
  • 基于Redis实现分布式锁的方法(lua脚本版)

    基于Redis实现分布式锁的方法(lua脚本版)

    这篇文章主要介绍了基于Redis实现分布式锁的方法(lua脚本版),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • 如何基于Session实现短信登录功能

    如何基于Session实现短信登录功能

    对比起Cookie,Session是存储在服务器端的会话,相对安全,并且不像Cookie那样有存储长度限制,下面这篇文章主要给大家介绍了关于如何基于Session实现短信登录功能的相关资料,需要的朋友可以参考下
    2022-10-10
  • Redis集群新增、删除节点以及动态增加内存的方法

    Redis集群新增、删除节点以及动态增加内存的方法

    本文主要介绍了Redis集群新增、删除节点以及动态增加内存的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论