PHP实现Redis指定库号数据迁移
本文介绍一种使用PHP脚本迁移Redis指定数据库(DB)的方法,无需 dump 整个文件。通过解析地址、端口和库号,遍历源Redis所有键值对,根据数据类型执行相应的读写操作。
结果与目标
实现从一个Redis实例的特定库号(如 DB7)到另一个Redis实例(或同一实例的不同库号)的数据迁移。
准备条件
服务器已安装 PHP 环境。
确保 PHP 扩展
redis已安装且开启。确认源 Redis 地址、端口、目标 Redis 地址、端口以及具体的数据库编号。
注意:以下脚本会在执行过程中向目标库写入大量数据,请确保目标库有足够的存储空间。
真实操作顺序
第1步:创建迁移脚本文件
目的:编写用于连接源库、获取所有键、并根据类型迁移数据的逻辑。
动作:
在服务器上创建一个新的 PHP 文件,例如
migrate.php。编写如下代码,修改
$from和$to变量以匹配实际环境。
<?php
$from = '10.0.2.52:6379/7';
$to = '127.0.0.1:6379/7';
$from_redis = redis_init($from);
$to_redis = redis_init($to);
$keys = $from_redis->keys('*');
$count = 0;
$total = count($keys);
foreach($keys as $key){
if(++$count % 100 == 1){
echo "$count/$total\n";
}
$type = $from_redis->type($key);
switch($type){
case Redis::REDIS_STRING:
$val = $from_redis->get($key);
$to_redis->set($key, $val);
break;
case Redis::REDIS_LIST:
$list = $from_redis->lRange($key, 0, -1);
foreach($list as $val){
$to_redis->rPush($key, $val);
}
break;
case Redis::REDIS_HASH:
$hash = $from_redis->hGetAll($key);
$to_redis->hMSet($key, $hash);
break;
case Redis::REDIS_ZSET:
$zset = $from_redis->zRange($key, 0, -1, true);
foreach($zset as $val=>$score){
$to_redis->zAdd($key, $score, $val);
}
break;
}
}
function redis_init($conf){
$redis = new Redis();
preg_match('/^([^:]+)(:[0-9]+)?\\/(.+)?/', $conf, $ms);
$host = $ms[1];
$port = trim($ms[2], ':');
$db = $ms[3];
$redis->connect($host, $port);
$redis->select($db);
return $redis;
}
?>
第2步:配置连接参数
入口:编辑 migrate.php 文件顶部。
动作:
修改
$from变量:'IP:PORT/DB_NUMBER'格式。修改
$to变量:'IP:PORT/DB_NUMBER'格式。
重要参数说明:
如果没有密码,直接写
'127.0.0.1:6379/0'。如果涉及密码,上述简易正则解析可能不适用,需手动添加
$redis->auth('password');。DB 编号范围通常为 0-15(取决于 Redis 配置)。
第3步:运行脚本进行迁移
目的:执行数据搬运。
动作:
打开终端。
运行命令:`php migrate.php`
可观察状态: 脚本会打印进度信息,例如:
1/407
101/407
201/407
...
当控制台无报错且不再输出进度时,表示迁移完成。
完成判断
脚本执行完毕后,登录目标 Redis 客户端,检查 DB_NUMBER 下的数据总量是否与源库一致,随机抽取几个 Key 验证数据内容是否完整。
原文有依据的排错
连接失败:检查 IP、端口是否正确,防火墙是否放行 6379 端口。
权限问题:如果设置了 requirepass,需要在
redis_init函数中增加$redis->auth('你的密码');。超时:如果数据量极大,建议设置超时时间
$redis->setTimeout(0);或在后台以 nohup 方式运行。
简要总结
以上关于 PHP 实现 Redis 指定库号迁移的详细内容,更多关于 Redis 数据迁移的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













