я использую PHPRedis за это.
Мне нужно создать скрипт, который копирует все ключи с шаблоном mobile*
от одного редиса host1 в host2.
У меня это работает, выбрав все ключи из host1 с рисунком mobile*
, Затем цикл по каждому из этих ключей с помощью get
ключевой метод для возврата данных. Затем я установил ключ для host2 с использованием set
метод:
$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, чтобы выполнить все из них вместо отключения / ключа.
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 .
Как правило, лучше избегать использования KEYS в рабочем коде. Желательно изменить приложение, которое пишет ключи, чтобы сохранить список используемых ключей, где это возможно, или использовать более новую операцию SCAN.
В этом случае вы обнаружили, что для KEYS не потребовалось много времени (будет, если у вас очень большое пространство ключей, количество ключей будет расти со временем?), Поэтому низкая производительность обусловлена всеми обходами сети. Один за GET. Конвейеры — действительно отличный способ группировки операций, чтобы избежать обходов.
В этом случае я предлагаю использовать MGET, чтобы получить все значения в одной сетевой операции, и MSET, чтобы обновить их в одной сетевой операции.