Bredis 0.07 - отправка команды HMSET с несколькими записями - PullRequest
1 голос
/ 22 мая 2019

Попытка выяснить лучший способ отправить команду HMSET с большим (возможно, 2000 пар).

То, что я сейчас делаю, - это создание одной строки для каждого куска пар, настроенной как «ключевое» значение ». Это лучший способ, или каждый из них в качестве параметра для single_command_t, или как итератор, с командой, ключом и всеми парами значений после? @Ivan Baidakou

 modbusResponseCommands.emplace_back(bredis::single_command_t("MULTI"));
...
for (int j = 0; j < data._readCoilsResponses.size(); ++j) {
   int regId = data._readCoilsResponses[j].first;
   int regValue = data._readCoilsResponses[j].second;

   dataStr += std::to_string(regId) + '"';
   dataStr += std::to_string(regValue) + '"';
   dataStr += " ";
   if (j != 0 && j % 2000 == 0) {
        modbusResponseCommands.emplace_back(
            bredis::single_command_t(
                "HMSET",
                _key + ":rcres:unitId:" + std::to_string(unit.first),
                dataStr
            )
        );
        dataStr = "";
    }
}
modbusResponseCommands.emplace_back(
    bredis::single_command_t(
        "HMSET",
        _key + ":rcres:unitId:" + std::to_string(unit.first),
        dataStr
    )
);
...
modbusResponseCommands.emplace_back(bredis::single_command_t("EXEC"));
...

1 Ответ

0 голосов
/ 01 июня 2019

Вам не нужно MULTI, так как HMSET уже поддерживает несколько ключей / значений одновременно.

using pair_t = std::pair<std::string, std::string>;
using holder_t = std::vector<pair_t>;
holder_t holder;
std::vector<std::pair<int, int>> _readCoilsResponses;
r::single_command_t cmd{"HMSET"};
for (int j = 0; j < _readCoilsResponses.size(); ++j) {
   int regId = _readCoilsResponses[j].first;
   int regValue = _readCoilsResponses[j].second;
   holder.emplace_back(std::to_string(regId), std::to_string(regValue));
   auto& last_pair = holder.back();
   cmd.arguments.emplace_back(last_pair.first);
   cmd.arguments.emplace_back(last_pair.second);
}

В основном MULTI должен иметь тот же эффект, что и HMSET со всеми аргументами, но это немного увеличит нагрузку на redis-сервер.

Вы можете опустить MULTI и просто отправить список HMSET команд, которые будут выполняться неатомно, но таким образом вы немного вдохнете для redis-сервера; но это должно иметь значение, если вы отправляете мегабайты данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...