我正在使用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分钟。还有另一种方法吗?
答案 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的不同方式,那么还有一些库。
答案 1 :(得分:1)
通常,最好在生产代码中避免使用KEYS。最好修改正在编写密钥的应用程序,以便在可能的情况下保留正在使用的密钥列表,或者使用较新的SCAN操作。
在这种情况下,你发现KEYS没有花费很长时间(当你有一个非常大的密钥空间时,密钥的数量会随着时间而增长吗?),所以性能缓慢是由于所有的网络往返。每GET一个。管道确实是分组操作以避免往返的好方法。
在这种情况下,我建议使用MGET来获取一个网络op和MSET中的所有值,以便在一个网络操作中更新它们。