关于返回类型

时间:2016-01-06 13:33:15

标签: c++ redis return-type

我最近在我的一个c ++程序中加入了redis连接。我决定使用redox库,因为它似乎很容易使用,并且不依赖于boost库。

我使用连接将值插入redis中的列表。该命令大部分时间都有效,但有时我收到一条错误消息,指出Received reply of type 3, expected type 1 or 5.经过大量搜索后,我在hiredis.h头文件中找到了这些返回类型。看起来图书馆需要StringStatus回复类型,但会收到Integer类型。

不幸的是,我还无法找到有关这意味着什么以及如何解决问题的任何信息。特别是代码有时有效,有时不会让我困惑。

在我的用例中,我将一个包含celery格式的json字典(但基本上只是一个字符串)的字符串值插入到列表中。我很确定它与字符串组成的方式无关,因为通过redis-cli客户端手动插入相同的字符串工作正常。

我插入邮件的代码是:

redox::Redox rdx;
try {
    if(!rdx.connect("localhost", 6379)){
        cerr << "Could not connect to redis" << endl;
    }

    redox::Command<string>& c = rdx.commandSync<string>({"lpush", "queue_name", message});
    if(!c.ok()) {
        cerr << "Error while communicating with redis" << c.status() << endl;
    }
} catch (runtime_error& e) {
    cerr << "send_message: Exception in redox: " << e.what() << endl;
}

打印的错误是!c.ok()检查后的错误。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您遇到的问题是由于您使用字符串作为响应的参数。

documentation of redox中所述:

  

此语句告诉redox运行命令GET hello。 <string>模板参数意味着我们希望将回复放入字符串中,并且我们希望服务器使用可以放入字符串的内容进行响应

但是这很有效,因为这个例子使用了&#34; GET&#34;预期返回字符串的命令。对于&#34; LPUSH&#34;使用返回结果的命令是一个整数,使用redis-cli

发出命令时可以看到
127.0.0.1:6379> lpush "test" test
(integer) 1

因此,您必须使用带有整数参数的响应,列出here的可能响应的完整列表是:

<redisReply*>: All reply types, returns the hiredis struct directly
<char*>: Simple Strings, Bulk Strings
<std::string>: Simple Strings, Bulk Strings
<long long int>: Integers
<int>: Integers (careful about overflow, long long int recommended)
<std::nullptr_t>: Null Bulk Strings, any other receiving a nil reply will get a NIL_REPLY status
<std::vector<std::string>>: Arrays of Simple Strings or Bulk Strings (in received order)
<std::set<std::string>>: Arrays of Simple Strings or Bulk Strings (in sorted order)
<std::unordered_set<std::string>>: Arrays of Simple Strings or Bulk Strings (in no order)

所以这样的事情会这样做:

redox::Redox rdx;
try {
  if(!rdx.connect("localhost", 6379)){
    cerr << "Could not connect to redis" << endl;
  }

  redox::Command<int>& c = rdx.commandSync<int>({"lpush", "queue_name", message});

  if(!c.ok()) {
    cerr << "Error while communicating with redis" << c.status() << endl;
}}catch (runtime_error& e) {
    cerr << "send_message: Exception in redox: " << e.what() << endl;
}

或者如果使用lamda:

redox::Redox rdx;
try {
  if(!rdx.connect("localhost", 6379)){
    cerr << "Could not connect to redis" << endl;
  }

  rdx.commandSync<int>(
    {"lpush", "queue_name", message},
    [](redox::Command<int>& response){
      if(!response.ok()){
        cerr << "Error while communicating with redis" << c.status() << endl;
  }});  
}catch (runtime_error& e) {
    cerr << "send_message: Exception in redox: " << e.what() << endl;
}