Выберите все ключевые данные для определенного шаблона из Redis, используя переполнение стека

я использую 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 минут. Есть ли другой способ сделать это?

0

Решение

Самый простой маршрут к 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 массовый импорт с использованием —pipe

1

Другие решения

Как правило, лучше избегать использования KEYS в рабочем коде. Желательно изменить приложение, которое пишет ключи, чтобы сохранить список используемых ключей, где это возможно, или использовать более новую операцию SCAN.

В этом случае вы обнаружили, что для KEYS не потребовалось много времени (будет, если у вас очень большое пространство ключей, количество ключей будет расти со временем?), Поэтому низкая производительность обусловлена ​​всеми обходами сети. Один за GET. Конвейеры — действительно отличный способ группировки операций, чтобы избежать обходов.

В этом случае я предлагаю использовать MGET, чтобы получить все значения в одной сетевой операции, и MSET, чтобы обновить их в одной сетевой операции.

1

По вопросам рекламы [email protected]