您的位置:首页 > 数据库 > Redis

c语言操作redis数据库

2017-10-07 18:05 309 查看
原文地址:

c语言操作redis数据库

前言

下面简单介绍使用c语言操作redis数据库.

准备内容

hiredis

这是redis官方推荐的基于C接口的客户端组件

在redis的源码包的deps/hiredis下就有源码,也可以另行下载hiredis

安装方法,进入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<hiredis/hiredis.h>


主要接口:

函数原型:redisContext *redisConnect(const char *ip, int port)

说明:该函数用来连接redis数据库,参数为数据库的ip地址和端口,

该函数返回一个结构体redisContext。

函数原型:void *redisCommand(redisContext *c, const char *format, …);

说明:该函数执行redis命令,当然也包括由lua脚本组成的命令.

函数原型void freeReplyObject(void *reply);

说明:释放redisCommand执行后返回的redisReply所占用的内存

函数原型:void redisFree(redisContext *c);

说明:释放redisConnect()所产生的连接。

后面的操作基本都是基于以上函数.

结构体

redis reply结构体:

/* This is the reply object returned by redisCommand() */
typedef struct redisReply {
int type; /* REDIS_REPLY_* */
long long integer; /* The integer when type is REDIS_REPLY_INTEGER */
size_t len; /* Length of string */
char *str; /* Used for both REDIS_REPLY_ERROR and REDIS_REPLY_STRING */
size_t elements; /* number of elements, for REDIS_REPLY_ARRAY */
struct redisReply **element; /* elements vector for REDIS_REPLY_ARRAY */
} redisReply;


实例

我们使用redis数据库的hash表存储以下学生信息

sid –学号

name –学生姓名

gender –学生性别

major –专业

c语言数据结构

#define SID_MAX_LENGHT 16
#define NAME_MAX_LENGHT 16
#define MAJOR_MAX_LENGHT 64
typedef struct Stu_Info_Struct
{
char sid[SID_MAX_LENGHT];
char name[NAME_MAX_LENGHT];
int gender;//0 male,1 female
char major[MAJOR_MAX_LENGHT];
}Stu_Info_Struct;


c代码 stu_manager.c

/***************************************************************
*   Copyright (C) 2017 All rights reserved.
*
*   文件名称:stu_manager.c
*   创 建 者:hyb
*   创建日期:2017年10月07日
*   描    述:
*
***************************************************************/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<hiredis/hiredis.h>

/*宏定义*/
#define SID_MAX_LENGHT 16
#define NAME_MAX_LENGHT 16
#define MAJOR_MAX_LENGHT 64
#define CMD_MAX_LENGHT  256
#define REDIS_SERVER_IP "127.0.0.1"
#define REDIS_SERVER_PORT 6379
/*结构体定义*/
typedef struct Stu_Info_Struct
{
char sid[SID_MAX_LENGHT];
char name[NAME_MAX_LENGHT];
int gender;//0 male,1 female
char major[MAJOR_MAX_LENGHT];
}Stu_Info_Struct;

typedef enum STU_RESULT
{
SUCCESS=0,
FAILURE=1
}STU_RESULT;

/*函数*/
STU_RESULT addStu(Stu_Info_Struct *stu);
STU_RESULT exeRedisIntCmd(char *cmd);
STU_RESULT quryStuBySid(char *sid);
STU_RESULT exeRedisStrCmd(char *cmd);
/**************************************
函数名:addStu
函数功能:添加学生信息
输入参数:stu 学生信息结构指针
输出参数:
返回值:STU_RESULT  成功或失败
************************************/
STU_RESULT addStu(Stu_Info_Struct *stu)
{
char cmd[CMD_MAX_LENGHT] = {0};
/*检查入参*/
if(NULL == stu)
{
printf("NULL pointer");
return FAILURE;
}
/*组装redis命令*/
snprintf(cmd,CMD_MAX_LENGHT,"hset stu:%s name %s gender %d major %s",
stu->sid,stu->name,stu->gender,stu->major);

/*执行redis命令*/
if(FAILURE == exeRedisIntCmd(cmd))
{
printf("add student %s,%s,%d,%s failure\n",stu->sid,stu->name,stu->gender,stu->major);
return FAILURE;
}
printf("add student %s,%s,%d,%s success\n",stu->sid,stu->name,stu->gender,stu->major);
return SUCCESS;
}
/**************************************
函数名:exeRedisIntCmd
函数功能:执行redis 返回值为int类型命令
输入参数:cmd  redis命令
输出参数:redis 返回结构
返回值:STU_RESULT
*************************************/
STU_RESULT exeRedisIntCmd(char *cmd)
{
/*检查入参*/
if(NULL == cmd)
{
printf("NULL pointer");
return FAILURE;
}

/*连接redis*/
redisContext *context = redisConnect(REDIS_SERVER_IP,REDIS_SERVER_PORT);
if(context->err)
{
redisFree(context);
printf("%d connect redis server failure:%s\n",__LINE__, context->errstr);
return FAILURE;
}
printf("connect redis server success\n");

/*执行redis命令*/
redisReply *reply = (redisReply *)redisCommand(context, cmd);
if(NULL == reply)
{
printf("%d execute command:%s failure\n",__LINE__,cmd);
redisFree(context);
return FAILURE;
}
//返回执行结果为整型的命令,只有状态为REDIS_REPLY_INTEGER,并且INTEGER是大于0时,才表示这种类型的命令执行成功
if(!(reply->type == REDIS_REPLY_INTEGER && reply->integer > 0))
{
printf("%d execute command:%s failure\n",__LINE__, cmd);
freeReplyObject(reply);
redisFree(context);
return FAILURE;
}

freeReplyObject(reply);
redisFree(context);
printf("%d execute command:%s success\n",__LINE__,cmd);
return SUCCESS;

}

STU_RESULT quryStuBySid(char *sid)
{
char cmd[CMD_MAX_LENGHT] = {0};
if(NULL == sid)
{
printf("%d NULL pointer\n",__LINE__);
return FAILURE;
}
snprintf(cmd,CMD_MAX_LENGHT,"HGETALL stu:%s",sid);
if(FAILURE == exeRedisStrCmd(cmd))
{
printf("%d query stu failue",__LINE__);
return FAILURE;
}
return SUCCESS;
}
STU_RESULT exeRedisStrCmd(char *cmd)
{

/*检查入参*/
if(NULL == cmd)
{
printf("NULL pointer");
return FAILURE;
}

/*连接redis*/
redisContext *context = redisConnect(REDIS_SERVER_IP,REDIS_SERVER_PORT);
if(context->err)
{
redisFree(context);
printf("%d connect redis server failure:%s\n",__LINE__, context->errstr);
return FAILURE;
}
printf("connect redis server success\n");

/*执行redis命令*/
redisReply *reply = (redisReply *)redisCommand(context, cmd);
if(NULL == reply)
{
printf("%d execute command:%s failure\n",__LINE__,cmd);
redisFree(context);
return FAILURE;
}
//返回执行结果为整型的命令,只有状态为REDIS_REPLY_INTEGER,并且INTEGER是大于0时,才表示这种类型的命令执行成功
if(!(reply->type == REDIS_REPLY_ARRAY && reply->elements > 0))
{
printf("%d execute command:%s failure\n",__LINE__, cmd);
freeReplyObject(reply);
redisFree(context);
return FAILURE;

}

printf("%d,%lu\n",reply->type,reply->elements);
int i = 0;
for(i=0;i < reply->elements;i++)
{
if(i%2 ==0)
{
printf("%s:",reply->element[i]->str);
}
else
{

printf("%s\n",reply->element[i]->str);
}
}
freeReplyObject(reply);
redisFree(context);
return SUCCESS;
}
int main(int argc,char *argv[])
{
Stu_Info_Struct stu =
{
"01",
"hu",
1,
"CS"
};

addStu(&stu);
quryStuBySid("01");
return 0;
}


编译c代码

gcc -g stu_manager.c -o stu -lhiredis


启动redis服务器

redis-server


运行

./stu


问题:提示libhiredis.so.0.10: cannot open shared object file: No such file or directory

/usr/lib/hiredis目录下没有hiredis库,将编译链接好的hiredis库拷贝到/usr/lib/hiredis目录下,

并且执行命令重新加载配置

ldconfig


运行结果:

root@ubuntu-15:redis# ./stu
connect redis server success
116 execute command:hset stu:01 name hu gender 1 major CS success
add student 01,hu,1,CS success
connect redis server success
2,6
name:hu
gender:1
major:CS


可以看到分别执行的添加和查询操作成功.

总结

以上内容仅仅是hiredis接口的简单使用.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis c语言 hiredis