前段时间,在写一个后台服务框架,底层要用到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建立的连接。
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;
}