c语言操作redis数据库
2017-10-07 18:05
309 查看
原文地址:
c语言操作redis数据库
这是redis官方推荐的基于C接口的客户端组件
在redis的源码包的deps/hiredis下就有源码,也可以另行下载hiredis
安装方法,进入deps/hiredis目录,执行命令
主要接口:
函数原型: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结构体:
sid –学号
name –学生姓名
gender –学生性别
major –专业
c语言数据结构
c代码 stu_manager.c
问题:提示libhiredis.so.0.10: cannot open shared object file: No such file or directory
/usr/lib/hiredis目录下没有hiredis库,将编译链接好的hiredis库拷贝到/usr/lib/hiredis目录下,
并且执行命令重新加载配置
运行结果:
可以看到分别执行的添加和查询操作成功.
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学习】:Java操作redis数据库
- C++操作Redis数据库
- 用c语言动态操作sqilite3数据库v2.0
- ODBC-C语言操作数据库(SQL Server 2000)(上)
- ODBC-C语言操作数据库(SQL Server 2000)(下)
- sqlite嵌入式数据库C语言基本操作(1)
- C语言ODBC操作数据库遇到的一些问题
- 在Linux下用C语言操作数据库sqlite3(建立数据库)
- java操作Redis数据库的redis工具,RedisUtil,jedis工具JedisUtil,JedisPoolUtil
- 数据库缓存-Redis 部署与基本操作
- 使用node_redis进行redis数据库crud操作
- [ODBC] C语言操作数据库
- jfinal main方法里操作数据库+redis
- Redis教程(十五):C语言连接操作代码实例
- Redis:安装、配置、操作和简单代码实例(C语言Client端)
- sqlite3数据库C语言简单操作基础之数据的增删改(二)
- C语言操作Redis总结
- c语言操作数据库sql
- Jedis操作Redis数据库的方法
- Redis源码解析:09redis数据库实现(键值对操作、键超时功能、键空间通知)