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