c语言操作redis数据库

来源:互联网 发布:ubuntu 调整分辨率 编辑:程序博客网 时间:2024/06/05 02:05

原文地址:
c语言操作redis数据库

前言

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

准备内容

  • hiredis
    这是redis官方推荐的基于C接口的客户端组件
    在redis的源码包的deps/hiredis下就有源码,也可以另行下载hiredis
    安装方法,进入deps/hiredis目录,执行命令

    makemake installmkdir /usr/lib/hiredis\#下面两条影响运行cp libhiredis.so /usr/lib/hiredis //将动态连接库libhiredis.so至/usr/lib/hiredismkdir /usr/include/hirediscp 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 64typedef 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# ./stuconnect redis server success116 execute command:hset stu:01 name hu gender 1 major CS successadd student 01,hu,1,CS successconnect redis server success2,6name:hugender:1major:CS

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

总结

以上内容仅仅是hiredis接口的简单使用.

原创粉丝点击