redis 學習 hiredis庫使用(一)

2021-10-21 02:13:18 字數 4961 閱讀 7317

redis 學習-hiredis庫使用(一)

hiredis 是redis的客戶端sdk,可以讓程式操作redis。本文先講建立連線,基本的get/set命令,讀寫二進位制,獲取多個結果來講。假設讀者已經了解redis命令了。

hiredis的**也包含在redis**中,redis\deps\hiredis目錄下,介面很簡單,幾乎不用封裝就可以用。

1.1 無超時時間,阻塞

rediscontext *redisconnect(const char *ip, int port); 

1.1.1函式原型:

rediscontext *redisconnect(const char *ip, int port);

1.1.4 使用例子

rediscontext *c = redisconnect("127.0.0.1", 6379);

if (c == null || c->err) else

}這個rediscontext不是乙個執行緒安全的物件,也就是說,多個執行緒同時訪問這乙個物件可能會出現問題。

1.2 設定超時時間,阻塞

rediscontext *redisconnectwithtimeout(const char *ip, int port, const struct timeval tv);  

1.3 非阻塞,立刻返回,也就無所謂超時

rediscontext *redisconnectnonblock(const char *ip, int port);

1.4 傳送命令請求

1.5釋放資源

/*釋放資源*/

void freereplyobject(void *reply);

void redisfree(rediscontext *c);

void *rediscommand(rediscontext *c, const char *format, ...);

2.1 返回值

返回值是redisreply型別的指標:

/* this is the reply object returned by rediscommand() */

typedef struct redisreply redisreply;

2.2 返回值型別

type欄位,包含以下幾種型別:

#define redis_reply_string 1    //字串

#define redis_reply_array 2     //陣列,例如mget返回值

#define redis_reply_integer 3   //數字型別

#define redis_reply_nil 4       //空

#define redis_reply_status 5    //狀態,例如set成功返回的『ok』

#define redis_reply_error 6     //執行失敗

redis_reply_string == 1:返回值是字串,字串儲存在redis->str當中,字串長度為redis->len。

redis_reply_array == 2:返回值是陣列,陣列大小存在redis->elements裡面,陣列值儲存在redis->element[i]裡面。陣列裡面儲存的是指向redisreply的指標,陣列裡面的返回值可以通過redis->element[i]->str來訪問,陣列的結果裡全是type==redis_reply_string的redisreply物件指標。

redis_reply_integer == 3:返回值為整數 long long。

redis_reply_nil==4:返回值為空表示執行結果為空。

redis_reply_status ==5:返回命令執行的狀態,比如set foo bar 返回的狀態為ok,儲存在str當中 reply->str == "ok"。

redis_reply_error ==6 :命令執行錯誤,錯誤資訊存放在 reply->str當中。

返回結果示例:

set key value : 返回 string reply->str == "ok"。

hset key hkey value:返回 integer reply->integer == 1。

hdel key hkey:返回 integer reply->integer ==1。

sadd set member:返回 integer reply->integer ==1。

sismember setkey member:返回 integer reply->integer ==1。

smembers setkey:返回 array reply->element[i]->str為返回結果值。

函式原型

void *rediscommandar**(rediscontext *c, int argc, const char **ar**, const size_t *ar**len);

引數說明

ar**len這個陣列儲存了命令引數中,每乙個引數的長度,包含命令本身,比如 set foo bar 則ar**len =,如果ar**len為空,那麼這個函式內部會自動呼叫strlen函式對每個引數進行求長度。

ar** 存放每個命令引數的指標,ar**=

argc 存放命令引數的個數上面的例子中argc=3

c 為rediscontext物件。

為每乙個引數指定長度,可以是二進位制安全的函式。函式會按著長度來決定字串的終止,而不是'\0'.

char hkey = "123456";

char hset = "hset";

char key = "testkey";

char hvalue = "3210";

int argc = 4;

char *ar** = ;

size_t ar**len = ;

rediscommandar**(context,argc,ar**,ar**len);

> hgetall testkey

會得到321並不會得到和hvalue一樣的值"3210",因為在hset命令中指定了長度,只會讀取前面的三個字元。

函式原型:

reply = rediscommand(context,"subscribe foo");

freereplyobject(reply);

while(redisgetreply(context,&reply) == redis_ok)

所有的返回結果都需要釋放資源呼叫freereplyobject函式。這個函式會遞迴的釋放陣列中的資源,不需要手動釋放陣列資源。

5.1函式原型

void freereplyobject(void *reply);

void redisfree(rediscontext *c);

5.2引數說明

freereplyobject函式中reply 實際為指向redisreply結構體的指標,可能是rediscommand的返回值,後續可以看到以也能是管道命令執行結果的返回值。

redisfree函式中c實際為指向rediscontext物件,這個函式會清理連線資源並釋放連線。

如果使用c++來操作redis資料庫,建議寫乙個類對這些c的介面進行封裝,符合自己的邏輯。下面是乙個可能使用方案。

class redis

else}}

string hget(const char* key,const  char* hkey)

freereplyobject(reply);

return value;

}int hset(const char* key, const char* hkey, const char* value)

int hset(const char* key,const char* hkey,const char* hvalue, size_t hvaluelen)

/**delete key*/

int del(const char* key)

freereplyobject(reply);

return res;

}/*if key id exists*/

int existskey(const char* id)

freereplyobject(reply);

return res;

}virtual ~redis()

protected:

private:

};3.1 set

redisreply *r1 = (redisreply*)rediscommand(c, "set k v");

結果: type = 5

len = 2

str = ok

返回的型別5,是狀態。str是ok,代表執行成功。

3.2 get

redisreply *r2 = (redisreply*)rediscommand(c, "get k");

結果: type = 1

len = 1

str = v

返回的型別是1,字串型別,str是『v』 ,剛才儲存的。

char sz = ;

redisreply *r3 = (redisreply*)rediscommand(c, "set kb %b",sz,sizeof(sz));

存二進位制的時候,使用%b,後面需要對應兩個引數,指標和長度。

redisreply *r4 = (redisreply*)rediscommand(c, "get kb");

讀取二進位制的時候,和普通是一樣的,str欄位是位址,len欄位是長度。

存多個值

拼接字串就好啦

size_t elements; /* number of elements, for redis_reply_array */

struct redisreply **element; /* elements vector for redis_reply_array */

知道了以上知識,基本可以上手幹活了,redis的介面還是很不錯的,感覺都不用封裝了。

C語言使用hiredis訪問redis

hiredis是redis資料庫的簡約c客戶端庫。它是簡約的,因為它只是增加了對協議的最小支援,但是同時它使用了乙個高階別的 printf like api,所以對於習慣了 printf 風格的c程式設計使用者來說,其非常容易使用,而且api中沒有明確的繫結每個 redis 命令。github 編譯...

C語言通過Hiredis訪問redis資料庫

c語言訪問redis資料庫 準備hiredis庫 centos7或8 hiredis 0.11.0.tar.gz yum install redis 安裝hiredis庫 解壓hiredis壓縮包 tar zcvf hiredis 0.11.0.tar.gz 在hiredis根目錄執行 make m...

redis命令簡介和hiredis的使用

客戶端第二次訪問資料庫時,直接從redis讀出 客戶端 key string value string 設定乙個鍵值對 string string set key value 通過key得到value get key 同時設定乙個或多個 key value 對 mset key value key ...