redis(RemoteDictionaryServer)是一个使用ANSIC编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库--来自维基百科。由于其读写性能高、数据结构丰富、支持主从复制、支持持久化等其他特性,使得redis成为当前最流行的key-value型数据库。本文将简单介绍c语言中如何操作redis数据库。
准备工作hiredis安装hiredis是redis官方推荐的基于C接口的客户端组件,它提供接口,供c语言调用以操作数据库。我们需要将hiredis安装到我们的系统中,在redis的源码包的deps/hiredis下就有它的源码,也可以另行下载hiredis安装方法,进入deps/hiredis目录,执行命令:
makemakeinstallldconfig#使动态库在系统中更新生效接口介绍
函数原型:redisContext*redisConnect(constchar*ip,intport);说明:该函数用来连接redis数据库,参数为数据库的ip地址和端口,通常默认端口为。该函数返回一个redisContext对象。
函数原型:void*redisCommand(redisContext*c,constchar*format,…);说明:该函数执行redis命令,当然也包括由lua脚本组成的命令,返回redisReply对象。
函数原型voidfreeReplyObject(void*reply);说明:释放redisCommand执行后返回的redisReply所占用的内存。
函数原型:voidredisFree(redisContext*c);说明:释放redisConnect()所产生的连接。
后面的示例操作基本都是基于以上函数。
redisreply对象:
/*ThisisthereplyobjectreturnedbyredisCommand()*/typedefstructredisReply{inttype;/*返回结果类型**/longlonginteger;/*返回类型为整型的时候的返回值*/size_tlen;/*字符串长度*/char*str;/*返回错误类型或者字符类型的字符串*/size_telements;/*返回数组类型时,元素的数量*/structredisReply**element;/*元素结果集合,redisReply对象*/}redisReply;
其中,返回类型有以下几种:
REDIS_REPLY_STRING1//字符串REDIS_REPLY_ARRAY2//数组,多个reply,通过element数组以及elements数组大小访问REDIS_REPLY_INTEGER3//整型REDIS_REPLY_NIL4//空,没有数据REDIS_REPLY_STATUS5//状态,str字符串以及lenREDIS_REPLY_ERROR6//错误,同STATUS
其他的我们暂时不过多介绍,下面通过一个简单的实例来看看这些接口的基本使用。
实例实例通过redis数据库的hash表存储以下学生信息:
字段名含义sid学号name学生姓名gender学生性别major专业c语言描述如下:
#defineSID_MAX_LENGHT16#defineNAME_MAX_LENGHT16#defineMAJOR_MAX_LENGHT64typedefstructStu_Info_Struct{charsid[SID_MAX_LENGHT];charname[NAME_MAX_LENGHT];intgender;//0male,1femalecharmajor[MAJOR_MAX_LENGHT];}Stu_Info_Struct;
程序清单stu_manager.c如下:
/****************************************************************Copyright(C)Allrightsreserved.**文件名称:stu_manager.c*创建者:hyb*创建日期:年10月07日*描述:****************************************************************/#includestdio.h#includestring.h#includestdlib.h#includehiredis/hiredis.h/*宏定义*/#defineSID_MAX_LENGHT16#defineNAME_MAX_LENGHT16#defineMAJOR_MAX_LENGHT64#defineCMD_MAX_LENGHT#defineREDIS_SERVER_IP".0.0.1"#defineREDIS_SERVER_PORT/*结构体定义*/typedefstructStu_Info_Struct{charsid[SID_MAX_LENGHT];charname[NAME_MAX_LENGHT];intgender;//0male,1femalecharmajor[MAJOR_MAX_LENGHT];}Stu_Info_Struct;typedefenumSTU_RESULT{SUCCESS=0,FAILURE=1}STU_RESULT;/*函数*/STU_RESULTaddStu(Stu_Info_Struct*stu);/*添加信息*//*执行命令*/STU_RESULTexeRedisIntCmd(char*cmd);STU_RESULTquryStuBySid(char*sid);STU_RESULTexeRedisStrCmd(char*cmd);/**************************************函数名:addStu函数功能:添加学生信息输入参数:stu学生信息结构指针输出参数:返回值:STU_RESULT成功或失败************************************/STU_RESULTaddStu(Stu_Info_Struct*stu){charcmd[CMD_MAX_LENGHT]={0};/*检查入参*/if(NULL==stu){printf("NULLpointer");returnFAILURE;}/*组装redis命令*/snprintf(cmd,CMD_MAX_LENGHT,"hsetstu:%sname%sgender%dmajor%s",stu-sid,stu-name,stu-gender,stu-major);/*执行redis命令*/if(FAILURE==exeRedisIntCmd(cmd)){printf("addstudent%s,%s,%d,%sfailure\n",stu-sid,stu-name,stu-gender,stu-major);returnFAILURE;}printf("addstudent%s,%s,%d,%ssuccess\n",stu-sid,stu-name,stu-gender,stu-major);returnSUCCESS;}/**************************************函数名:exeRedisIntCmd函数功能:执行redis返回值为int类型命令输入参数:cmdredis命令输出参数:redis返回结构返回值:STU_RESULT*************************************/STU_RESULTexeRedisIntCmd(char*cmd){/*检查入参*/if(NULL==cmd){printf("NULLpointer");returnFAILURE;}/*连接redis*/redisContext*context=redisConnect(REDIS_SERVER_IP,REDIS_SERVER_PORT);if(context-err){redisFree(context);printf("%dconnectredisserverfailure:%s\n",__LINE__,context-errstr);returnFAILURE;}printf("connectredisserversuccess\n");/*执行redis命令*/redisReply*reply=(redisReply*)redisCommand(context,cmd);if(NULL==reply){printf("%dexecute