亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C基礎(chǔ) redis緩存訪問(wèn)詳解

 更新時(shí)間:2016年06月12日 15:48:58   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇C基礎(chǔ) redis緩存訪問(wèn)詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

引言

先說(shuō)redis安裝, 這里采用的環(huán)境是.

Linux version 4.4.0-22-generic (buildd@lgw01-41) 
(gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) 
#40-Ubuntu SMP Thu May 12 22:03:46 UTC 2016

對(duì)于 ubuntu 安裝 redis是非常簡(jiǎn)單的. 這里采用源碼安裝. 安裝代碼如下

wget http://download.redis.io/releases/redis-3.0.6.tar.gz
tar xzf redis-3.0.6.tar.gz
cd redis-3.0.6
make

安裝后我的環(huán)境是

那我們測(cè)試一下. 安裝結(jié)果. 先啟動(dòng) redis-server 服務(wù)器.

再啟動(dòng) redis-cli 客戶端

我們開(kāi)始測(cè)試一下. 

 測(cè)試之后一切正常. redis linux上安裝基本完畢了. 更加詳細(xì)的參照

Redis 官網(wǎng)教程 很詳細(xì) http://www.redis.net.cn/tutorial/3501.html

前言

現(xiàn)在我們安裝 redis c 訪問(wèn)的驅(qū)動(dòng). hiredis. 一開(kāi)始都是下載安裝. 我是直接從 hiredis git官網(wǎng)下載安裝的.

hiredis  源碼 https://github.com/redis/hiredis

wget https://github.com/redis/hiredis/archive/master.zipunzip master.zip

 安裝完畢會(huì)看見(jiàn)這樣環(huán)境

執(zhí)行安裝命令

makesudo make install

本質(zhì)對(duì)于 make install 執(zhí)行了下面步驟

mkdir -p /usr/local/include/hiredis /usr/local/lib
cp -a hiredis.h async.h read.h sds.h adapters /usr/local/include/hiredis
cp -a libhiredis.so /usr/local/lib/libhiredis.so.0.13
cd /usr/local/lib && ln -sf libhiredis.so.0.13 libhiredis.so
cp -a libhiredis.a /usr/local/lib
mkdir -p /usr/local/lib/pkgconfig
cp -a hiredis.pc /usr/local/lib/pkgconfig

此刻基本上 hiredis 驅(qū)動(dòng)已經(jīng)安裝完畢. 后面解釋一下, 驅(qū)動(dòng)提供的api.

常用的 api如下.

/*
 * redis鏈接函數(shù), 返回redis上下文.
 * ip  : 鏈接地址的ip
 * port  : 鏈接端口
 *     : 返回 redis上下文, NULL表示獲取失敗
 */
redisContext *redisConnect(const char *ip, int port)


/*
 * 執(zhí)行redis操作命令, 返回得到的結(jié)果集
 *  context  : redisConnect 返回的redis上下文對(duì)象
 *  format  : 等同于 printf格式控制符
 *  ...    : 后面可變參數(shù), 需要和 format中格式符對(duì)應(yīng)
 *      : 返回 得到的結(jié)果集
 */
void *redisCommand(redisContext *context, const char *format, ...);

/*
 * 釋放redis命令操作返回過(guò)來(lái)的結(jié)果集
 * reply  : redisCommand返回的結(jié)果集
 */
void freeReplyObject(void *reply);

/*
 * 釋放鏈接上下文
 * context  : redisConnect返回的鏈接上下文
 */
void redisFree(redisContext *context);

 更加詳細(xì)的解釋我們可以看 源碼接口文件 hiredis/hiredis.h .  例如

第一個(gè)是 redisConnect 返回的 redisContext上下文結(jié)構(gòu)
/* Context for a connection to Redis */
typedef struct redisContext {
  int err; /* Error flags, 0 when there is no error */
  char errstr[128]; /* String representation of error when applicable */
  int fd;
  int flags;
  char *obuf; /* Write buffer */
  redisReader *reader; /* Protocol reader */
  enum redisConnectionType connection_type;
  struct timeval *timeout;
  struct {
    char *host;
    char *source_addr;
    int port;
  } tcp;
  struct {
    char *path;
  } unix_sock;
} redisContext;

還有一個(gè)是 redisCommand 返回的命令集
/* 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 */
  int 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;

關(guān)于 hiredis基本的C驅(qū)動(dòng)接口,解釋完畢. 后面開(kāi)始寫(xiě)demo測(cè)試一番.最好的理解方式還是看官方源碼和測(cè)試代碼.

正文

首先來(lái)個(gè)簡(jiǎn)單的demo測(cè)試. simpleget.c

#include <stdio.h>
#include <stdlib.h>
#include <hiredis/hiredis.h>

/*
 * 請(qǐng)求 redis網(wǎng)絡(luò)緩存服務(wù)器內(nèi)存.
 */
int main(int argc, char* argv[]) {
  redisContext *conn = redisConnect("127.0.0.1", 6379);
  if(NULL == conn) {
    fprintf(stderr, "redisConnect 127.0.0.1:6379 error!\n");
    exit(EXIT_FAILURE);
  }  
  if(conn->err) {
    fprintf(stderr, "redisConect error:%d\n", conn->err);
    redisFree(conn);
    exit(EXIT_FAILURE);
  }  
  
  // 這里redisConnect 鏈接對(duì)象創(chuàng)建完畢了
  redisReply *reply = redisCommand(conn, "get foo");
  if(reply && reply->type == REDIS_REPLY_STRING) {
    printf("get foo => %s\n", reply->str);
  }  
  printf("reply->type = %d\n", reply->type);

  // 釋放這個(gè)對(duì)象
  freeReplyObject(reply);
  // 釋放hiredis 上下文對(duì)象  
  redisFree(conn);

  return 0;
}

編譯命令是

gcc -Wall -ggdb -o simpleget.out simpleget.c -lhiredis

最終測(cè)試結(jié)果是

最終測(cè)試結(jié)果是


這里表明流程是跑通了. 這里擴(kuò)展一下, 有時(shí)候在Linux上查找函數(shù)或宏定義聲明好麻煩. 我用的方式是

 find . -name *.h | xargs grep 'REDIS_REPLY_STRING'

笨方法也挺實(shí)用的. 查找的結(jié)果是 上面 REDIS_REPLY_STRING 定義在 hiredis/read.h 中 摘錄部分如下

#define REDIS_REPLY_STRING 1
#define REDIS_REPLY_ARRAY 2
#define REDIS_REPLY_INTEGER 3
#define REDIS_REPLY_NIL 4
#define REDIS_REPLY_STATUS 5
#define REDIS_REPLY_ERROR 6

通過(guò)這些宏枚舉區(qū)分返回的值. 其實(shí)到這里基本上 關(guān)于 redis接口使用基本入門了. 后面再舉一個(gè) 操作list的操作代碼 setlist.c

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <hiredis/hiredis.h>

/*
 * 請(qǐng)求 redis網(wǎng)絡(luò)緩存服務(wù)器內(nèi)存.
 */
int main(int argc, char* argv[]) {
  // 忽略服務(wù)器退出,導(dǎo)致當(dāng)前進(jìn)程退出
  signal(SIGPIPE, SIG_IGN);

  redisContext *conn = redisConnect("127.0.0.1", 6379);
  if(NULL == conn) {
    fprintf(stderr, "redisConnect 127.0.0.1:6379 error!\n");
    exit(EXIT_FAILURE);
  }  
  if(conn->err) {
    fprintf(stderr, "redisConect error:%d\n", conn->err);
    redisFree(conn);
    exit(EXIT_FAILURE);
  }  
  
  // 這里redisConnect 鏈接對(duì)象創(chuàng)建完畢了
  freeReplyObject(redisCommand(conn, "lpush mylist foo"));
  freeReplyObject(redisCommand(conn, "lpush mylist bar"));
  redisReply *reply = redisCommand(conn, "lrange mylist 0 -1");
  if(reply && reply->type == REDIS_REPLY_ARRAY && reply->elements == 2) {
    printf("%s %s\n", reply->element[0]->str, reply->element[1]->str);
  }  
  else {
    printf("redisCommand [lrange mylist 0 -1] error:%d. %s\n", reply->type, reply->str);
  }  

  // 釋放這個(gè)對(duì)象
  freeReplyObject(reply);
  // 釋放hiredis 上下文對(duì)象  
  redisFree(conn);

  return 0;
}

編譯代碼

gcc -Wall -ggdb -o setlist.out setlist.c -lhiredis

 運(yùn)行結(jié)果如下

更加詳細(xì)介紹請(qǐng)參照 hiredis git上 源碼.

后記

 到這里關(guān)于C簡(jiǎn)單使用控制redis服務(wù)器, 基本講完了. 錯(cuò)誤是難免的. 歡迎指正.  

以上這篇C基礎(chǔ) redis緩存訪問(wèn)詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++實(shí)現(xiàn)LeetCode(116.每個(gè)節(jié)點(diǎn)的右向指針)

    C++實(shí)現(xiàn)LeetCode(116.每個(gè)節(jié)點(diǎn)的右向指針)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(116.每個(gè)節(jié)點(diǎn)的右向指針),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Qt數(shù)據(jù)庫(kù)應(yīng)用之?dāng)?shù)據(jù)打印到pdf

    Qt數(shù)據(jù)庫(kù)應(yīng)用之?dāng)?shù)據(jù)打印到pdf

    因?yàn)閤ls打開(kāi)以后用戶可以修改數(shù)據(jù)造假之類的,而pdf默認(rèn)是不可編輯的,除非借助專業(yè)的工具,所以如果想要限定用戶導(dǎo)出數(shù)據(jù)不能被更改,那導(dǎo)出pdf是最佳選擇。所以本文將為代價(jià)介紹Qt實(shí)現(xiàn)數(shù)據(jù)打印到pdf的方法,需要的可以參考一下
    2022-01-01
  • 如何通過(guò)指針突破C++類的訪問(wèn)權(quán)限

    如何通過(guò)指針突破C++類的訪問(wèn)權(quán)限

    這篇文章主要介紹了通過(guò)指針突破C++類的訪問(wèn)權(quán)限,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • C語(yǔ)言實(shí)現(xiàn)24點(diǎn)游戲計(jì)算器的示例代碼

    C語(yǔ)言實(shí)現(xiàn)24點(diǎn)游戲計(jì)算器的示例代碼

    24點(diǎn)是一種益智游戲,24點(diǎn)是把4個(gè)整數(shù)(一般是正整數(shù))通過(guò)加減乘除以及括號(hào)運(yùn)算,使最后的計(jì)算結(jié)果是24的一個(gè)數(shù)學(xué)游戲,24點(diǎn)可以考驗(yàn)人的智力和數(shù)學(xué)敏感性,它能在游戲中提高人們的心算能力。本文將用C語(yǔ)言實(shí)現(xiàn)這一游戲,感興趣的可以了解一下
    2022-08-08
  • C語(yǔ)言函數(shù)調(diào)用約定和返回值詳情

    C語(yǔ)言函數(shù)調(diào)用約定和返回值詳情

    這篇文章主要介紹了C語(yǔ)言函數(shù)調(diào)用約定和返回值詳情,函數(shù)調(diào)用約定不同,會(huì)影響函數(shù)生成的符號(hào)名,函數(shù)入?yún)㈨樞?,形參?nèi)存的清理者,更多相關(guān)需要的小伙伴可以參考下文詳情介紹
    2022-07-07
  • 如何使用C語(yǔ)言將數(shù)字、字符等數(shù)據(jù)寫(xiě)入、輸出到文本文件中

    如何使用C語(yǔ)言將數(shù)字、字符等數(shù)據(jù)寫(xiě)入、輸出到文本文件中

    在分析數(shù)據(jù)時(shí),首先要解決數(shù)據(jù)的保存問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于如何使用C語(yǔ)言將數(shù)字、字符等數(shù)據(jù)寫(xiě)入、輸出到文本文件中的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • C語(yǔ)言/C++如何生成隨機(jī)數(shù)

    C語(yǔ)言/C++如何生成隨機(jī)數(shù)

    這篇文章主要介紹了C語(yǔ)言/C++如何生成隨機(jī)數(shù),C語(yǔ)言/C++產(chǎn)生隨機(jī)數(shù)主要用到的是rand()函數(shù), srand()函數(shù),C語(yǔ)言/C++里沒(méi)有自帶的random(int number)函數(shù),如何解決?感興趣的小伙伴們可以參考一下
    2016-04-04
  • C++ 實(shí)現(xiàn)靜態(tài)鏈表的簡(jiǎn)單實(shí)例

    C++ 實(shí)現(xiàn)靜態(tài)鏈表的簡(jiǎn)單實(shí)例

    這篇文章主要介紹了C++ 實(shí)現(xiàn)靜態(tài)鏈表的簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C語(yǔ)言指針基礎(chǔ)詳解

    C語(yǔ)言指針基礎(chǔ)詳解

    這篇文章主要介紹了C語(yǔ)言指針的基礎(chǔ),主要對(duì)C語(yǔ)言中指針的本質(zhì)及常見(jiàn)用法做了較為通俗易懂的分析,是后續(xù)深入學(xué)習(xí)C語(yǔ)言的基礎(chǔ),需要的朋友可以參考下
    2021-10-10
  • Objective-C中常用的結(jié)構(gòu)體NSRange,NSPoint,NSSize(CGSize),NSRect實(shí)例分析

    Objective-C中常用的結(jié)構(gòu)體NSRange,NSPoint,NSSize(CGSize),NSRect實(shí)例分析

    這篇文章主要介紹了Objective-C中常用的結(jié)構(gòu)體NSRange,NSPoint,NSSize(CGSize),NSRect實(shí)例分析,有助于更加直觀的理解Object-C常用的結(jié)構(gòu)體,需要的朋友可以參考下
    2014-07-07

最新評(píng)論