如何使用hiredis 运行Redis sadd 命令
Posted
技术标签:
【中文标题】如何使用hiredis 运行Redis sadd 命令【英文标题】:How to run Redis sadd commands with hiredis 【发布时间】:2022-01-08 09:22:24 【问题描述】:我的代码包含一个头文件redis.h和一个c++源文件redis.cpp。
这是一个redis中悲伤操作的演示。所有操作都失败,因为 WRONGTYPE 操作对持有错误类型值的键进行。我不知道发生了什么。
请给我一些建议。
//redis.h
#ifndef _REDIS_H_
#define _REDIS_H_
#include <iostream>
#include <string.h>
#include <string>
#include <stdio.h>
#include <hiredis/hiredis.h>
using namespace std;
class Redis
public:
Redis()
~Redis()
this->_connect =NULL;
this->_reply=NULL;
bool connect(string host, int port)
this->_connect = redisConnect(host.c_str(), port);
if(this->_connect != NULL && this->_connect->err)
printf("connect error: %s\n", this->_connect->errstr);
return 0;
return 1;
string set(string key, string value)
this->_reply = (redisReply*)redisCommand(this->_connect, "sadd %s %s", key.c_str(), value.c_str());
string str = this->_reply->str;
return str;
string output(string key)
this->_reply = (redisReply*)redisCommand(this->_connect, "smembers %s", key.c_str());
string str = this->_reply->str;
freeReplyObject(this->_reply);
return str;
private:
redisContext * _connect;
redisReply* _reply;
;
#endif //_REDIS_H
//redis.cpp
#include "redis.h"
int main()
Redis *r = new Redis();
if(!r->connect("127.0.0.1", 6379))
printf("connect error!\n");
return 0;
printf("Sadd names Andy %s\n", r->set("names", "Andy").c_str());
printf("Sadd names Andy %s\n", r->set("names", "Andy").c_str());
printf("Sadd names Alice %s\n", r->set("names", "Alice").c_str());
printf("names members: %s\n", r->output("names").c_str());
delete r;
return 0;
结果:
Sadd names Andy WRONGTYPE 对持有错误值的键进行操作
Sadd names Andy WRONGTYPE 对持有错误值的键进行操作
Sadd names Alice WRONGTYPE 对持有错误值的键的操作
names members: WRONGTYPE 针对持有错误值的键的操作
【问题讨论】:
【参考方案1】:WRONGTYPE 对持有错误值的键的操作
这意味着键,即 names,已经被设置,并且它的类型不是 SET。您可以使用 redis-cli 运行 TYPE names
以查看密钥的类型。
另外,你的代码有几个问题:
redisConnect
可能返回空指针
您没有在您的set
方法中调用redisFree
来释放redisReply
的资源
sadd
和 smembers
不返回字符串回复,因此您无法得到正确的回复
由于你用的是C++,你可以试试redis-plus-plus,它基于hiredis,界面更加C++友好:
try
auto r = sw::redis::Redis("tcp://127.0.0.1:6379");
r.sadd("names", "Andy");
r.sadd("names", "Alice");
std::vector<std::string> members;
r.smembers("names", std::back_inserter(members));
catch (const sw::redis::Error &e)
// error handle
免责声明:我是redis-plus-plus的作者。
【讨论】:
非常感谢!我在 github 上盯着你的项目。让我稍后试一试。以上是关于如何使用hiredis 运行Redis sadd 命令的主要内容,如果未能解决你的问题,请参考以下文章