hiredis是redis数据库的简约C客户端库,是redis官方的C语言客户端,支持所有命令(command set),管道(pipelining),时间驱动编程(event driven programming)。
github地址:https://github.com/redis/hiredis
2. redis的安装和配置
wget http://download.redis.io/redis-stable.tar.gz //下载,拷贝到/usr/local写
tar -xzvf redis-stable.tar.gz //解压
cd redis-stable //进入解压目录
make //编译安装
make install //将可执行程序赋值到/usr/local/bin目录中,当执行程序中就不要输入完整的路径
make test //测试redis是否编译正确
可以根据本篇博文: redis的安装和配置
在redis的发行包中的deps目录中就包含hiredis的源码,手动编译安装,或者自行下载一份。地址:hiredis的地址
cd /deps/hiredis
make
make install
mkdir /usr/lib/hiredis
cp libhiredis.so /usr/lib/hiredis //将动态连接库libhiredis.so至/usr/lib/hiredis
mkdir /usr/include/hiredis
cp hiredis.h /usr/include/hiredis //头文件包含#include
redisContext *redisConnect(const char *ip, int port);
void *redisCommand(redisContext *c, const char *format, ...);
redisConnect
函数用于创建一个所谓的redisContext
,第一个参数传递一个ip,第二个传递端口。尝试使用redisConnect
连接到Redis redisConnect
您应该检查err
字段以查看建立连接是否成功。
redisContext
的结构如下:
typedef struct redisContext {
int err; /*错误标志,正确连接标志为0,出错时设置为非零常量*/
char errstr[128]; /*存放错误信息的字符串*/
int fd;
int flags;
char *obuf; /* Write buffer */
redisReader *reader; /* Protocol reader */
} redisContext;
//redisContext不是线程安全的
设置错误的非零常量有:
redisCommand
函数是一个可变参函数,格式与printf类似,第一个参数传递一个redisContext
的地址,由redisConnect
函数返回,第二个参数例如:说明符%s,第三个参数就是代替%s的字符串。
如果命令执行错误,返回值为NULL,redisContext
的err字段被设置为非零常量。如果,错误发生,原先的redisContext
就不能重复使用,需要重新建立一个新的连接。如果成功执行命令,则标准返回一个redisReply
类型,该类型结构如下:
typedef struct redisReply {
int type; /* 测试收到什么样的回返回 REDIS_REPLY_* */
long long integer; /* type 是 REDIS_REPLY_INTEGER 类型, integer保存返回的值*/
int len; /* 保存str类型的长度 */
char *str; /* type 是 REDIS_REPLY_ERROR 和 REDIS_REPLY_STRING,str保存返回的值 */
size_t elements; /* type 是 REDIS_REPLY_ARRAY,保存返回多个元素的数量 */
struct redisReply **element; /* 返回多个元素以redisReply对象的形式存放 */
} redisReply;
//type还可以是REDIS_REPLY_NIL,表示返回了一个零对象,没有数据可以访问。
当使用完redisReply
后,调用freeReplyObject
函数释放空间。
void freeReplyObject(void *reply);
断开连接并释放redisContext
空间。
void redisFree(redisContext *c);
#include
#include
#include
void test(void)
{
redisContext *context = redisConnect("127.0.0.1", 6379);//默认端口,本机redis-server服务开启
if(context->err) {
redisFree(context);
printf("connect redisServer err:%s\n", context->errstr);
return ;
}
printf("connect redisServer success\n");
const char *cmd = "SET test 100";
redisReply *reply = (redisReply *)redisCommand(context, cmd);
if(NULL == reply) {
printf("command execute failure\n");
redisFree(context);
return ;
}
//返回执行结果为状态的命令。比如set命令的返回值的类型是REDIS_REPLY_STATUS,然后只有当返回信息是"OK"时,才表示该命令执行成功。可以通过reply->str得到文字信息
if(!(reply->type == REDIS_REPLY_STATUS && strcmp(reply->str, "OK") == 0)) {
printf("command execute failure:%s\n", cmd);
freeReplyObject(reply);
redisFree(context);
return ;
}
freeReplyObject(reply);
printf("%s execute success\n", cmd);
const char *getVal = "GET test";
reply = (redisReply *)redisCommand(context, getVal);
if(reply->type != REDIS_REPLY_STRING)
{
printf("command execute failure:%s\n", getVal);
freeReplyObject(reply);
redisFree(context);
return ;
}
printf("GET test:%s\n", reply->str);
freeReplyObject(reply);
redisFree(context);
}
int main(void)
{
test();
return 0;;
}
➜ REDIS gcc test.c -lhiredis //编译链接
➜ REDIS ./a.out
connect redisServer success
SET test 100 execute success //执行"SET test 100"命令
GET test:100 //得到test的值
➜ REDIS redis-cli //命令行开启redis-cli客户端
127.0.0.1:6379> GET test //使用命令查看test值
"100"