1. 程式人生 > >c語言操作redis資料庫

c語言操作redis資料庫

前言

redis(Remote Dictionary Server)是一個使用ANSI C編寫的開源、支援網路、基於記憶體、可選永續性的鍵值對儲存資料庫–來自維基百科。由於其讀寫效能高、資料結構豐富、支援主從複製、支援持久化等其他特性,使得redis成為當前最流行的key-value型資料庫。本文將簡單介紹c語言中如何操作redis資料庫。

準備工作

hiredis安裝

hiredis是redis官方推薦的基於C介面的客戶端元件,它提供介面,供c語言呼叫以操作資料庫。我們需要將hiredis安裝到我們的系統中,在redis的原始碼包的deps/hiredis下就有它的原始碼,也可以另行下載hiredis


安裝方法,進入deps/hiredis目錄,執行命令:

make
make install
ldconfig   #使動態庫在系統中更新生效

介面介紹

  • 函式原型:redisContext *redisConnect(const char *ip, int port);
    說明:該函式用來連線redis資料庫,引數為資料庫的ip地址和埠,通常預設埠為6379。該函式返回一個redisContext物件。

  • 函式原型:void *redisCommand(redisContext *c, const char *format, …);
    說明:該函式執行redis命令,當然也包括由lua指令碼組成的命令,返回redisReply物件。

  • 函式原型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; /* 返回結果型別* */
long long integer; /* 返回型別為整型的時候的返回值 */ size_t len; /* 字串長度 */ char *str; /* 返回錯誤型別或者字元型別的字串 */ size_t elements; /* 返回陣列型別時,元素的數量*/ struct redisReply **element; /* 元素結果集合,redisReply物件 */ } redisReply;

其中,返回型別有以下幾種:

REDIS_REPLY_STRING 1 //字串
REDIS_REPLY_ARRAY 2    //陣列,多個reply,通過element陣列以及elements陣列大小訪問
REDIS_REPLY_INTEGER 3    //整型
REDIS_REPLY_NIL 4    //空,沒有資料
REDIS_REPLY_STATUS 5    //狀態,str字串以及len
REDIS_REPLY_ERROR 6    //錯誤,同STATUS

其他的我們暫時不過多介紹,下面通過一個簡單的例項來看看這些介面的基本使用。

例項

例項通過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;

程式清單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;

}
/**************************************
函式名:quryStuBySid
函式功能:通過sid查詢學生資訊
輸入引數:cmd  redis命令
輸出引數:redis 返回結構
返回值:STU_RESULT
*************************************/
STU_RESULT queryStuBySid(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);
    queryStuBySid("01");
    return 0;
}

編譯程式碼

gcc -g stu_manager.c -o stu -lhiredis

可能遇到問題:

libhiredis.so.0.10: cannot open shared object file: No such file or directory

/usr/lib/hiredis目錄下沒有hiredis庫,將編譯連結好的hiredis庫拷貝到/usr/lib/hiredis目錄下,並且執行命令重新載入配置:

ldconfig

啟動redis伺服器

redis-server

執行

./stu

執行結果:

[email protected]: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

程式首先將學生資訊新增到資料庫中,然後通過id將其結果查詢出來。

總結

本文對hiredis的介面進行了簡單的介紹,並通過一個小例項說明了這些介面在c中的使用。

微信公眾號:程式設計珠璣

在這裡插入圖片描述

相關推薦

c語言操作redis資料庫

前言 redis(Remote Dictionary Server)是一個使用ANSI C編寫的開源、支援網路、基於記憶體、可選永續性的鍵值對儲存資料庫–來自維基百科。由於其讀寫效能高、資料結構豐富、支援主從複製、支援持久化等其他特性,使得redis成為當前最流

C語言操作MySQL資料庫,進行連線、插入、修改、刪除等操作

  很多人用到MySQL來開發一些專案,有時為了效能,我們會直接用C語言來開發相關的模組,尤其在我們的web應用中,雖然PHP、JSP等指令碼均提供了MySQL的介面,但是顯然直接使用C語言具有更好的安全性和效能,Michael以前用PHP開發的多個專案中就使用了C語言編寫的

C語言操作mysql資料庫上傳變數

上傳變數文字內容 上傳命令:insert into table_name(list1,list2,...) values("***","***") 當上傳的值為變數時可如此執行 string a="上傳的檔案"; int id=1;//以上變數可隨意定義 char sqlstr[100];

C語言操作MySQL資料庫

參考MYSQL的幫助文件整理 這裡歸納了C API可使用的函式,並在下一節詳細介紹了它們。請參見“C API函式描述”。 函式 描述 mysql_affected_rows() 返回上次UPDATE、DELETE或INSERT查詢更改/刪除/插入的行數。 mysql_autocommit

C語言操作MySQL資料庫的增刪改查

if( mysql_real_query(&mysql,"select * from user", (unsigned long)strlen("select * from user")))//mysql_real_query函式第一個引數是定義的MYSQL變數;第二個是SQL查詢語句;第三個是查詢語

linux下C語言操作mysql資料庫(系統自帶版本3.23.54)

      我的上一篇blog介紹了在linux環境下如何安裝配置系統自帶的mysql資料庫,並列舉了mysql的一些簡單的操作。接下來我將介紹一下如何利用mysql提供給我們的API來訪問並操作mysql資料庫(C語言)。 首先,我們需要安裝mysql-devel-3.23

Linux--C語言操作資料庫(一)插入資料

 各種渠道去找有關於使用C語言操作資料庫的資料,好辛苦,弄出來了! 資料庫部分 首先建立一張表 create table children(childno int not null unique,fname varchar(20),age int);

新手學python(2):C語言呼叫完成資料庫操作

繼續介紹本人的python學習過程。本節介紹如何利用python呼叫c程式碼。內容還是基於音樂資訊提取的過程,架構如圖一。Python呼叫c實現的功能是利用python訪問c語言完成mysql資料庫操作。 在利用python呼叫c語言之前,我們需要首先完成c語言功能程式

Linux C語言程式設計-Linux資料庫操作--Linux上C語言操作SQLServer---知識點總結+例項

*********************注意:為了保證文章的完整性和全面性,作者會不定期對文章進行更新和修正********************* 1.freetds是什麼?     freetds其實就是個軟體而且是一款開源軟體,而且這個軟體支援相當多的系統,比如

c語言操作文件函數大全

feo ted getch output tell 回寫 cal 移動文件 內存空間 fopen(打開文件)相關函數 open,fclose表頭文件 #include<stdio.h>定義函數 FILE * fopen(const char * path,con

使用C語言操作bitmap(彩色變灰色,黑白)

這裡有有一篇bitmap基本格式的部落格,不再贅述 https://www.cnblogs.com/ZXNblog/p/4046342.html 下面講述怎麼將24為的bitmap影象變成灰色和黑白。 定義BITMAPFILEHEADER,和BITMAPINFOHEADE

使用RedisTemplate操作Redis資料庫

目錄 一.什麼是Redis 二.RedisTemplate及其相關方法 三.RedisTemplate操作Redis資料庫的具體例子 四.RedisTemplate和StringRedisTemplate的區別 一.什麼是Redis Redis是一個非關係型資料庫,具有很高的

C語言訪問INFORMIX資料庫 — SQLDA使用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C語言訪問INFORMIX資料庫 — 介面實現

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

jedis工具類:java操作redis資料庫

學完redis,需要在java客戶端中使用Jedis,作為連線redis的工具: JedisUtils工具類: public class JedisUtils{ //定義一個連線池物件: private final static JedisPool POOL; static {

c語言連結MySQL資料庫出現Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'

這個問題,困擾了我好幾天,最後終於解決了。首先,我用find命令找了半天,也只有/tmp/mysql.sock,當時我很崩潰啊,後來看到一篇文章,我忘了地址,讓我有感,於是解決了這個問題。 1、在/var/run/目錄下建立一個mysqld的資料夾(如果這個資料夾沒有的話)。 sudo

使用go語言操作mysql資料庫

1.下載並匯入資料庫驅動包 官方不提供實現,先下載第三方的實現,點選這裡檢視各種各樣的實現版本。 這裡選擇了Go-MySQL-Driver這個實現。地址是:https://github.com/go-sql-driver/mysql/。 然後按照裡面的說明下載驅動包: $ go get

操作redis資料庫的常用命令

1.啟動和訪問 啟動redis資料庫 sudo redis-server /etc/redis/redis.conf 終端訪問redis資料庫 sudo redis-cli -h 127.0.0.1 -p 6379 2.String (字串型別) se

PHP操作Redis資料庫常用方法

redis Redis支援的資料型別有 Stirng(字串), List(列表), Hash(字典), Set(集合), Sorted Set(有序集合); redis版本是Redis 2.6.12 系統是在Windows+Apache2.4+php5.6 連線: //例項化

Go語言操作Redis、MySQL

文章出處:http://www.cnblogs.com/wdliu/p/9330278.html 一、redis 簡介 redis(REmote DIctionary Server)是一個由Salvatore Sanfilippo寫key-value儲存系統,它由C語言編寫、遵守BSD協