redis 数据的迁移
之前使用过备份整个库的方式,现在想着能不能只备份指定的 'key',在网上搜搜
谷歌搜索:
migrate some keys from one redis to another
参考文章:
https://coderwall.com/p/eclzyg/redis-to-redis-data-copy
1.ruby 语言适用
2.作者又写了一个 npm 工具
https://www.npmjs.com/package/redis-utils-cli
https://kvz.io/blog/2013/04/16/migrate-redis-data-without-filesystem-access/
http://www.tothenew.com/blog/copying-redis-database-from-one-server-to-another/
1.这两篇应该表示的是同一个意思,使用 redis 的主从复制,来备份数据
https://sorentwo.com/2015/09/15/migrating-redis-data.html
1.这篇文章比较给力,给出了 4种方法,以及每种方法的限制
https://stackoverflow.com/questions/23222616/copy-all-keys-from-one-db-to-another-in-redis
1.使用命令行或脚本,借助 dump 和 restore 命令,一个一个键复制
https://www.cnblogs.com/zhoubaojian/articles/7866595.html
1.命令行和脚本方式,同一机器不同库,或不同机器的不同库都可以
https://github.com/sripathikrishnan/redis-rdb-tools
1.很给力,直接可以解析 redis 的 .rdb 文件为 json 文件,分析内存里的数据等等
https://jeremy.wordpress.com/2012/07/05/multiple-redis-instances-on-mac-os-x-with-homebrew/
1.在 mac 一台机器上,同时运行多个 redis 实例(非常适合本地开发使用)
总结:
1.move - 本机的多个库之前迁移
2.migrate - 可以单个、多个键迁移
3.dump&restore - 单个键迁移,migrate 内部可能就是这么使用的
4.主从复制
5.先备份数据库 rdb,然后覆盖
我们需要复制指定的键,只能使用 migrate 或 dump&restore,命令行或写脚本的方式
这里给出,综合几篇文章,最后测试成功的 导出 redis 数据的 shell 脚本:
#!/bin/bash
# 导出 redis 指定数据
source_host=localhost
source_port=6379
#source_socket=/tmp/redis-1.sock
source_db=0
target_host=localhost
#target_port=6379
target_socket=/tmp/redis-1.sock
target_db=0
i=1;
redis-cli -h $source_host -p $source_port -n $source_db keys "punch_card*" | while read key
do
echo "Copying 第 $i 个 $key"
# redis-cli --raw -h $source_host -p $source_port -n $source_db DUMP "$key" | head -c -1|redis-cli -x -h $target_host -s $target_socket -n $target_db RESTORE "$key" 0
redis-cli --raw -h $source_host -p $source_port -n $source_db DUMP "$key" | perl -pe 'chomp if eof' | redis-cli -x -h $target_host -s $target_socket -n $target_db RESTORE "$key" 0
((i++))
done
注意下:
测试过程中,有时会出现:
(error) ERR DUMP payload version or checksum are wrong
可参考:
https://github.com/antirez/redis/issues/3348
https://stackoverflow.com/questions/16127682/how-to-use-redis-dump-and-restore-offline
开始使用的是 'head -c -1' 命令,发现报错,切换成 perl -pe 'chomp if eof',解决!看其他回答应该是删除最后的换行符之类的,大家有兴趣可以自己研究下!