hiredis使用,封装代码示例
簡(jiǎn)言
1. c++下使用redis的話,hiredis是首選,封裝得好,接口簡(jiǎn)單
2. redis的下載和編譯請(qǐng)參考筆者的這篇博客,等待
3.?hiredis的編譯請(qǐng)參考筆者的這篇博客,等待
4. hiredis有個(gè)很大的優(yōu)點(diǎn)就是可以直接保存,讀取結(jié)構(gòu)體,簡(jiǎn)直不要太爽,不像go語(yǔ)言那種渣渣,只能保存字符串,想保存一個(gè)結(jié)構(gòu)體時(shí)要把結(jié)構(gòu)體序列化成字符串,比如轉(zhuǎn)成json字符串再保存,太麻煩
代碼下載地址
linux版:https://download.csdn.net/download/yzf279533105/11979214
windows版:代碼都一樣,沒(méi)時(shí)間寫(xiě)哈
接口和結(jié)構(gòu)
我們這里先了解一下hiredis的基本接口,筆者都加了注釋
// 連接數(shù)據(jù)庫(kù),只是連接,并未認(rèn)證,認(rèn)證可以通過(guò)redisCommand執(zhí)行命令來(lái)實(shí)現(xiàn) redisContext *redisConnect(const char *ip, int port);// 執(zhí)行命令,注意:redisCommand(),redisCommandArgv() 的返回值其實(shí)是 redisReply* 類(lèi)型 void *redisCommand(redisContext *c, const char *format, ...); void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);//釋放資源 void freeReplyObject(void *reply); void redisFree(redisContext *c);// 執(zhí)行命令的結(jié)果,注意:只要返回值不為空,就一定要釋放,不然會(huì)有內(nèi)存泄漏 typedef struct redisReply {/*執(zhí)行結(jié)果的類(lèi)型*/int type;/*執(zhí)行結(jié)果為整數(shù)時(shí),存儲(chǔ)返回值*/long long integer;/*執(zhí)行結(jié)果為string或error時(shí),存儲(chǔ)字符串的長(zhǎng)度*/size_t len;/*執(zhí)行結(jié)果是string或error時(shí),存儲(chǔ)返回值*/char *str;/*執(zhí)行結(jié)果是數(shù)組時(shí),表數(shù)組中元素的個(gè)數(shù)*/size_t elements;/*執(zhí)行結(jié)果是數(shù)組時(shí),存儲(chǔ)元素*/struct redisReply **element; } redisReply;?
接口封裝
注:筆者的感覺(jué)是只要支持了struct整體的保存和讀取,也就支持了大部分的讀寫(xiě)需求,比如string, hash對(duì)象,沒(méi)必要了
對(duì)吧,有了保時(shí)捷,還要啥自行車(chē),至于list set zset等結(jié)構(gòu)體,等有需求的時(shí)候再封裝,那時(shí)候會(huì)更新博客滴
1. 初始化,并連接及認(rèn)證,成功返回true, 失敗返回false
// 初始化 // IP : redisIP地址 // port : redis端口號(hào) // password : redis的認(rèn)證密碼 // timeout : 超時(shí)時(shí)間 bool Init(string IP, int port, string password, int timeout=5000);2. 執(zhí)行命令的接口
// 判斷指定key是否存在 bool Exist(string key);// 設(shè)置指定key的值,過(guò)期時(shí)間單位:秒 int Set(string key, string val, uint32_t expire);// 獲取指定key的值,字符串類(lèi)型 string Get(string key);// 設(shè)置指定key的值,bin類(lèi)型 // pVal : 內(nèi)存地址 // len : 內(nèi)存大小 // expire : 過(guò)期時(shí)間,單位:秒 int Set(string key, const char* pVal, int length, uint32_t expire);// 獲取指定key的值,bin類(lèi)型 int Get(string key, CAutoRedisReply& reply);實(shí)驗(yàn)結(jié)果如圖(這里只實(shí)驗(yàn)了string和結(jié)構(gòu)體的保存,讀取)
測(cè)試代碼如下
#include <stdio.h> #include <string.h> #include <iostream> #include "redis_client.h" using namespace std;// 測(cè)試結(jié)構(gòu)體,里面有各種類(lèi)型的字段,但是不能有string類(lèi)型,必須要能整體拷貝 struct SStruct {SStruct(){memset(this,0,sizeof(*this));}int a;float b;char c[20];char d; };int main() {// redis連接實(shí)例CRedisClient m_redisClient;// redis配置,應(yīng)該寫(xiě)在配置文件中讀取,這里只是簡(jiǎn)單演示string IP = "192.168.11.177";int port = 6379;string password = "yzf279533105";int timeout = 5000;// 初始化,并建立連接if(!m_redisClient.Init(IP,port,password,timeout)){printf("main(), Init() failed");return -1;}/// Set測(cè)試 string類(lèi)型 /string key = "key_1";string val = "value_1";int result = m_redisClient.Set(key, val, 30);if(result != REDIS_SUCCESS){printf("main(), Set(string) failed");return -1;}printf("main(), Set(string), success, key=%s, value=%s \n", key.c_str(), val.c_str());// Get測(cè)試 string類(lèi)型 //string value = m_redisClient.Get(key);printf("main(), Get(string), success, key=%s, value=%s \n", key.c_str(), value.c_str());/ Set測(cè)試 結(jié)構(gòu)體類(lèi)型 //SStruct s1;s1.a = 321;s1.b = 3.14159;strcpy(s1.c,"hello world!");s1.d = 'a';string key2 = "struct:1";result = m_redisClient.Set(key2, (char*)&s1, sizeof(SStruct), 100);if(result != REDIS_SUCCESS){printf("main(), Set(struct) failed");return -1;}printf("main(), Set(struct), success, key2=%s \n", key2.c_str());// Get測(cè)試 結(jié)構(gòu)體類(lèi)型 //CAutoRedisReply reply;result = m_redisClient.Get(key2, reply);if(result != REDIS_SUCCESS){printf("main(), Get(struct), failed");return -1;}redisReply* replyPtr = reply.get();SStruct s2;// 整體拷貝給s2結(jié)構(gòu)體即可memcpy(&s2, replyPtr->str,sizeof(SStruct));printf("main(), Get(struct), success, s2.a=%d, s2.b=%f, s2.c=%s, s2.d=%c \n", s2.a, s2.b, s2.c, s2.d);getchar();return 0; }?
總結(jié)
以上是生活随笔為你收集整理的hiredis使用,封装代码示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: redis 6379端口telnet不通
- 下一篇: 游戏服务器正式发布时动态库处理的两种策略