程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C基本 redis緩存拜訪詳解

C基本 redis緩存拜訪詳解

編輯:關於C++

C基本 redis緩存拜訪詳解。本站提示廣大學習愛好者:(C基本 redis緩存拜訪詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C基本 redis緩存拜訪詳解正文


引言

先說redis裝置, 這裡采取的情況是.

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

關於 ubuntu 裝置 redis長短常簡略的. 這裡采取源碼裝置. 裝置代碼以下

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

裝置後我的情況是

那我們測試一下. 裝置成果. 先啟動 redis-server 辦事器.

再啟動 redis-cli 客戶端

我們開端測試一下. 

 測試以後一切正常. redis linux上裝置根本終了了. 加倍具體的參照

Redis 官網教程 很具體 http://www.redis.net.cn/tutorial/3501.html

媒介

如今我們裝置 redis c 拜訪的驅動. hiredis. 一開端都是下載裝置. 我是直接從 hiredis git官網下載裝置的.

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

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

 裝置終了會看見如許情況

履行裝置敕令

makesudo make install

實質關於 make install 履行了上面步調

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 驅動曾經裝置終了. 前面說明一下, 驅動供給的api.

經常使用的 api以下.

/*
 * redis鏈接函數, 前往redis高低文.
 * ip  : 鏈接地址的ip
 * port  : 鏈接端口
 *     : 前往 redis高低文, NULL表現獲得掉敗
 */
redisContext *redisConnect(const char *ip, int port)


/*
 * 履行redis操作敕令, 前往獲得的成果集
 *  context  : redisConnect 前往的redis高低文對象
 *  format  : 同等於 printf格局掌握符
 *  ...    : 前面可變參數, 須要和 format中格局符對應
 *      : 前往 獲得的成果集
 */
void *redisCommand(redisContext *context, const char *format, ...);

/*
 * 釋放redis敕令操作前往過去的成果集
 * reply  : redisCommand前往的成果集
 */
void freeReplyObject(void *reply);

/*
 * 釋放鏈接高低文
 * context  : redisConnect前往的鏈接高低文
 */
void redisFree(redisContext *context);

 加倍具體的說明我們可以看 源碼接口文件 hiredis/hiredis.h .  例如

第一個是 redisConnect 前往的 redisContext高低文構造
/* 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;

還有一個是 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;

關於 hiredis根本的C驅動接口,說明終了. 前面開端寫demo測試一番.最好的懂得方法照樣看官方源碼和測試代碼.

注釋

起首來個簡略的demo測試. simpleget.c

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

/*
 * 要求 redis收集緩存辦事器內存.
 */
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 鏈接對象創立終了了
  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);

  // 釋放這個對象
  freeReplyObject(reply);
  // 釋放hiredis 高低文對象  
  redisFree(conn);

  return 0;
}

編譯敕令是

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

終究測試成果是

終究測試成果是


這裡注解流程是跑通了. 這裡擴大一下, 有時刻在Linux上查找函數或宏界說聲明好費事. 我用的方法是

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

笨辦法也挺適用的. 查找的成果是 下面 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

經由過程這些宏列舉辨別前往的值. 其實到這裡根本上 關於 redis接口應用根本入門了. 前面再舉一個 操作list的操作代碼 setlist.c

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

/*
 * 要求 redis收集緩存辦事器內存.
 */
int main(int argc, char* argv[]) {
  // 疏忽辦事器加入,招致以後過程加入
  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 鏈接對象創立終了了
  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);
  }  

  // 釋放這個對象
  freeReplyObject(reply);
  // 釋放hiredis 高低文對象  
  redisFree(conn);

  return 0;
}

編譯代碼

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

 運轉成果以下

加倍具體引見請參照 hiredis git上 源碼.

跋文

 到這裡關於C簡略應用掌握redis辦事器, 根本講完了. 毛病是不免的. 迎接斧正.  

以上這篇C基本 redis緩存拜訪詳解就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved