【问题标题】:Dump and Restore Redis on PHP (predis)在 PHP (predis) 上转储和恢复 Redis
【发布时间】:2016-07-03 07:05:54
【问题描述】:

如何在 PHP 上转储和恢复 redis 数据库,我在客户端上使用 predis

我可以以 .rdb 格式转储 redis 数据库吗?

更新:

我使用以下命令转储/备份数据库,

$redis->bgSave();

如何将其还原回我的数据库?

【问题讨论】:

    标签: php redis predis phpredis


    【解决方案1】:

    作为 Malinga,Redis 服务器重启时会进行恢复。所以你需要设置 appendonly no。这样它将使用 .rdb 文件。

    所以,我创建了一个示例程序来备份和恢复redis数据库,这里是code你可以check

    导出:

    $i = 0;
    $json = array();
    foreach($redis->keys('*') as $key) {
        $data = array();
        $data['key'] = $key;
        $data['ttl'] = $redis->ttl($key);
        $data['value'] = bin2hex($redis->dump($key));
        $json[$i] = $data;
        $i++;
    }
    header('Content-disposition: attachment; filename=database.json');
    header('Content-type: application/json');
    echo json_encode($json);
    

    导入:

    if (isset($_POST['submit']) && $_POST['submit'] == 'Import') {
        $types = array(
            'application/json',
            'application/octet-stream'
        );
        if (in_array($_FILES['upload']['type'], $types)) {
            var_dump($_FILES);
            if (move_uploaded_file($_FILES['upload']['tmp_name'], 'uploads/' . $_FILES['upload']['name']))
                {
                $file = file_get_contents('uploads/' . $_FILES['upload']['name'], "r");
                $database = json_decode($file, true);
                foreach($database as $data)
                    {
                    if ($data['ttl'] >= 0)
                        {
                        $data['ttl'] = $data['ttl'];
                        }
                      else
                        {
                        $data['ttl'] = 0;
                        }
    
                    if ($data['key'] && $data['value'] && !$redis->exists($data['key']))
                        {
                        $redis->restore($data['key'], $data['ttl'], hex2bin($data['value']));
                        }
                    }
                }
            }
    }
    

    完整代码可通过GitHub下载

    【讨论】:

      【解决方案2】:

      在 redis 中,您可以使用 SAVE 或 BGSAVE 创建快照。但是建议使用 BGSAVE,因为 SAVE 会阻止所有其他客户端。

      要在predis中做到这一点,应该可以通过

      $client->executeRaw(['BGSAVE']);
      

      对不起,我没有用 predis 尝试过。所以首先检查客户端是否允许类似

      $client->bgsave(); 
      

      如果不尝试以上方法

      恢复发生在redis服务器重启时。所以你需要设置 appendonly no。这样它将使用 .rdb 文件

      【讨论】:

      • 是的,我有备份,如何恢复?
      • 已编辑答案@ŞivāSankĂr
      • 感谢您的信息。我正在尝试构建用于转储和恢复的代码。希望我现在有一个想法。
      • 是的,我明白了,正如您所见,除了 redis 服务器重启之外,没有其他方法可以恢复转储。
      猜你喜欢
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多