我最近在我的一个c ++程序中加入了redis连接。我决定使用redox库,因为它似乎很容易使用,并且不依赖于boost库。
我使用连接将值插入redis中的列表。该命令大部分时间都有效,但有时我收到一条错误消息,指出Received reply of type 3, expected type 1 or 5.
经过大量搜索后,我在hiredis.h头文件中找到了这些返回类型。看起来图书馆需要String
或Status
回复类型,但会收到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()
检查后的错误。
感谢您的帮助。
答案 0 :(得分:1)
您遇到的问题是由于您使用字符串作为响应的参数。
此语句告诉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;
}