Bredis 0.07-发送带有多个条目的HMSET命令

时间:2019-05-21 21:45:00

标签: c++ redis

试图找出发送大型(可能是2000对)HMSET命令的最佳方法。

我目前正在为每个成对的块创建一个字符串,并将其设置为“键”值”。这是最好的方法,还是将其作为对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 :(得分:0)

您不需要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);
}

基本上,MULTIHMSET的所有参数都具有相同的作用,但是它将给redis-server带来更多的负担。

您可以省略MULTI并仅发送HMSET命令列表,这些命令将以非原子方式执行,但是这样您可以为redis-server喘口气。但是如果您发送兆字节的数据,那应该很重要。