【学习笔记】C++操作redis库

来源:互联网 发布:java中框架的作用 编辑:程序博客网 时间:2024/06/03 11:01
前段时间,在写一个后台服务框架,底层要用到redis的操作。因为编程语言用的是C++,而且是在Linux下,因此想要操作redis,必须要通过hiredis接口来实现。下面将介绍一下hiredis接口的用法。
hiredis主要包括4个方法,灵活运用这4个方法,就可以对redis进行操作了。
1. redisContext* redisConnectWithTimeout(const char *ip, int port, const struct timeval tv)
该函数用来连接redis库,ip为redis地址,port为redis端口号,tv为连接超时的时间。redisContext是hiredis里定义的一个结构体类型,包含错误标志、连接类型、链接地址、端口号等信息。使用这个命令时要注意判断返回值是否为空,判断错误标志是否为0,以及判断连接是否超时等。
2. void *redisCommand(redisContext *c, const char *format, ...)
该函数用于执行redis数据库中的命令,第一个参数为redis建立连接后,返回的redisContext值,第二个参数为对redis要执行的命令操作。此函数的返回值为void*,但是一般都会强制转换为redisReply类型,以便做进一步的处理。
3. void freeReplyObject(void *reply)
该函数用于释放redisCommand执行后返回的redisReply占用的内存。
4. void redisFree(redisContext* c)
该函数用于释放redisConnect和redisConnectWithTimeout建立的连接。

下面我们就通过一个简单的例子来实现对redis的操作。

#include <iostream>#include <string>#include <stdio.h>#include <hiredis/hiredis.h>#include <sys/time.h>#include <time.h>using namespace std;char *m_szRedisHost="127.0.0.1";  //redis地址uint16_t m_iRedisPort=6379;  //redis端口int timeout=4000000; //超时时间struct timeval m_RedisTimeout;m_RedisTimeout.tv_sec=timeout / 1000000;m_RedisTimeout.tv_usec=timeout % 1000000;bool RedisConnectWithTimeout(redisContext* redis_context){    if (redis_context != NULL)    {        redisFree(redis_context);    }    redis_context = redisConnectWithTimeout(                            m_szRedisHost,                            m_iRedisPort,                            m_RedisTimeout);    if (redis_context == NULL or redis_context->err)    {        printf("Connect to redisServer faile\n");        return false;    }    if (redisSetTimeout(redis_context, m_RedisTimeout) != REDIS_OK)    {        printf("Connect to redisServer time out\n");        return false;    }    return true;}void GetData(redisContext* redis_context,string &strUserId,string &result){    redisReply *reply;    string strCommand = "HGET user_" + strUserId;    reply = static_cast<redisReply*>(redisCommand(redis_context, strCommand.c_str()));    if (reply == NULL)    {        printf("Get Data failed\n");        redisFree(redis_context);        return;    }    if (reply->type != REDIS_REPLY_STRING)    {        freeReplyObject(reply);        return;    }    result = string(reply->str, reply->len);    freeReplyObject(reply);}int main(){    redisContext* redis_context;    string userId = "01";    string result;    if (RedisConnectWithTimeout(redis_context))    {        GetData(redis_context,userId,result);    }    return 0;}


0 0