Select 使用 PHP 来自 Redis 的特定模式的所有关键数据

Select all key data for a specific pattern from Redis using PHP

我正在为此使用 PHPRedis

我需要创建脚本,将模式为 mobile* 的所有键从一个 Redis host1 复制到 host2 .

我通过从 host1 中选择具有模式 mobile* 的所有键来完成此工作。然后使用 get 键方法遍历每个键以 return 数据。然后我使用 set 方法为 host2 设置密钥:

$auKeys = $redis->keys("mobile*");
foreach ($auKeys as $key) {
    $data = $redis->get($key);
    $redis2->set($key, $data, 6000);
    echo $key;
}

问题是这大约需要 5 分钟 - 我需要将其缩短到 2-3 分钟。还有其他方法吗?

为了获得更好的性能,通往 SET 的最简单途径是 PIPE 键并点击 redis 服务器一次以执行所有这些键,而不是 trip/key 。

https://github.com/phpredis/phpredis/issues/251

$pipeline = $redis->multi($host, Redis::PIPELINE);

//put result in our shared list
foreach ($items as $item) {
  $pipeline->sAdd($key, $item);
}

$ret = $pipeline->exec();

同时,如果您正在寻找一种不同的方式将命令翻译成 Redis Protocol,也可以使用库。

redis bulk import using --pipe

通常,最好避免在生产代码中使用 KEYS。最好修改写入密钥的应用程序,尽可能保留正在使用的密钥列表,或者使用更新的 SCAN 操作。

在这种情况下,您透露 KEYS 并没有花费很长时间(当您有一个非常大的密钥 space 时,密钥的数量会随着时间增加吗?),所以性能很慢是由于所有网络往返。每个 GET 一个。管道确实是将操作分组以避免往返的好方法。

在这种情况下,我建议使用 MGET 在一个网络操作中获取所有值,并使用 MSET 在一个网络操作中更新它们。