PHP实现Redis指定库号数据迁移

一只小鹿
一只小鹿
发布时间:2026-10-14 | 6人浏览过
原创

本文介绍一种使用PHP脚本迁移Redis指定数据库(DB)的方法,无需 dump 整个文件。通过解析地址、端口和库号,遍历源Redis所有键值对,根据数据类型执行相应的读写操作。

结果与目标

实现从一个Redis实例的特定库号(如 DB7)到另一个Redis实例(或同一实例的不同库号)的数据迁移。

准备条件

  1. 服务器已安装 PHP 环境。

  2. 确保 PHP 扩展 redis 已安装且开启。

  3. 确认源 Redis 地址、端口、目标 Redis 地址、端口以及具体的数据库编号。

  4. 注意:以下脚本会在执行过程中向目标库写入大量数据,请确保目标库有足够的存储空间。

真实操作顺序

第1步:创建迁移脚本文件

目的:编写用于连接源库、获取所有键、并根据类型迁移数据的逻辑。

动作:

  1. 在服务器上创建一个新的 PHP 文件,例如 migrate.php。

  2. 编写如下代码,修改 $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步:运行脚本进行迁移

目的:执行数据搬运。

动作:

  1. 打开终端。

  2. 运行命令:`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 数据迁移的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表