在Java中,可以直接使用 Jedis 来操作 Redis,但是在C++中要稍微麻烦一些。在 C++ 中需要使用 hiredis 动态库来操作Redis。hiredis 是 Redis 数据库的 C 接口,目前只能在 Linux 下使用。只需要几个简单基本的函数就能操作 Redis 数据库了。首先要配置好动态库环境
git clone https://github.com/redis/hiredis make make install
到此已经安装成功,接下来在程序中就可以直接用了,在程序中引用头文件如下:
#include
下面介绍一些基础的API。
API介绍redisConnect函数,原型如下。该函数用来连接 Redis 数据库,函数参数为字符串类型的 ip 地址和整型端口号。返回值为 redisContext 类型的指针。
redisContext* redisConnect(const char *ip, int port);
redisContext 包含连接相关的信息,它里面有个err字段,0表示正常,其他表示出错了!通过errstr字段可以知晓错误信息。
string ip = "192.168.44.100";
int port = 6379;
redisContext* redis = redisConnect(ip.c_str(), port);
if (redis != nullptr && redis->err != 0) {
cout << "connect error: " << redis->err << endl;
}
redisCommand函数,原型如下。该函数执行redis数据库中的操作命令,第一个参数为连接数据库时返回的redisContext*,剩下的参数为变参,就如C标准函数printf函数一样的变参。 返回值为void*,一般强制转换成为redisReply类型,以便做进行进一步的处理。
void* redisCommand(redisContext* c, const char* format, ...);
redisReply* reply = (redisReply*)redisCommand(redis, "set key value"); redisReply* reply = (redisReply*)redisCommand(redis, "set key %s", value); redisReply* reply = (redisReply*)redisCommand(redis, "set %s %s", key, value); redisReply* reply = (redisReply*)redisCommand(redis, "get %s", key); redisReply* reply = (redisReply*)redisCommand(redis, "get key"); // ...
redisCommand函数的返回值类型为,redisReply*, 我们需要通过判断它的type字段来知道返回了具体什么样的内容:
REDIS_REPLY_STATUS 表示状态,内容通过str字段查看,字符串长度是len字段
REDIS_REPLY_ERROR 表示出错,查看出错信息,如上的str,len字段
REDIS_REPLY_INTEGER 返回整数,从integer字段获取值
REDIS_REPLY_NIL 没有数据返回
REDIS_REPLY_STRING 返回字符串,查看str,len字段
REDIS_REPLY_ARRAY 返回一个数组,查看elements的值(数组个数),通过element[index]的方式访问数组元素,每个数组元素是一个redisReply对象的指针
redisCommandArgv函数,函数原型如下。和redisCommand函数差不多,但是可以批量的执行命令。
void* redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
freeReplyObject函数,函数原型如下。用来释放 redisCommand 函数执行后返回的 redisReply 所占用的内存。
void freeReplyObject(void* reply);
redisFree函数,函数原型如下。用来断开 redisConnect 函数所产生的连接,并释放 redisContext 的内容。
void redisFree(redisContext* c);测试案例
test.cpp内容如下:
#include编译运行:#include #include using namespace std; class Redis { public: Redis() {} ~Redis() { redisFree(m_connect); this->m_connect = nullptr; this->m_reply = nullptr; } // 创建连接 bool connect(string& host, int port) { this->m_connect = redisConnect(host.c_str(), port); if (this->m_connect != nullptr && this->m_connect->err) { cout << "connect error: " << this->m_connect->err << endl; return false; } return true; } // set 操作 void set(const string& key, const string& value) { redisCommand(this->m_connect, "SET %s %s", key.c_str(), value.c_str()); } // get 操作 string get(const string& key) { this->m_reply = (redisReply*)redisCommand(this->m_connect, "GET %s", key.c_str()); if (m_reply->type == REDIS_REPLY_NIL) return "nil"; string str = this->m_reply->str; freeReplyObject(this->m_reply); return str; } private: redisContext* m_connect; redisReply* m_reply; }; int main() { string ip = "192.168.44.100"; int port = 6379; Redis* redis = new Redis(); redis->connect(ip, port); string operat; cout << "Usage: Input set(SET) or get(GET)" << endl; while (cin >> operat) { if (operat == "get" || operat == "GET") { string key; cout << "Please input key: "; cin >> key; cout << "Get the value is " << redis->get(key) << endl; } else if (operat == "set" || operat == "SET") { string key, value; cout << "Please input key value: "; cin >> key >> value; redis->set(key, value); } else { cout << "Usage: Input set(SET) or get(GET) to operat Redis." << endl; } } return 0; }
makefile文件内容如下(路径要写对,-lhiredis 不能丢):
target=test lib=test.cpp $(target):$(lib) g++ -std=c++11 $^ -o $@ -I /usr/local/include/ -L /usr/local/lib -lhiredis
make,./test(一定要先确保redis服务已经开启) 执行效果如下
登录redis中查看,可以看到,键值对确实已经存在了



