日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C基础 redis缓存访问

發布時間:2024/4/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.zip unzip master.zip

?安裝完畢會看見這樣環境

執行安裝命令

make sudo 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服務器, 基本講完了. 錯誤是難免的. 歡迎指正. ?

/**********************************************************************

**        直接向大師們而不是他們得的學生領悟。?

**                         ? —— 阿貝爾

***********************************************************************/

?

轉載于:https://www.cnblogs.com/life2refuel/p/5560944.html

總結

以上是生活随笔為你收集整理的C基础 redis缓存访问的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。