使用PHP从Redis中选择特定模式的所有关键数据

时间:2016-04-01 13:06:49

标签: php redis key keystore host

我正在使用PHPRedis

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

我通过使用模式mobile* host1 中选择所有键来实现此目的。然后使用get键方法循环遍历每个键以返回数据。然后,我使用set方法设置 host2 的键:

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

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

2 个答案:

答案 0 :(得分:1)

SET可以获得更好性能的最简单路线是PIPE密钥并点击redis服务器一次执行所有密钥而不是旅行/密钥。

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

答案 1 :(得分:1)

通常,最好在生产代码中避免使用KEYS。最好修改正在编写密钥的应用程序,以便在可能的情况下保留正在使用的密钥列表,或者使用较新的SCAN操作。

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

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