標籤:
因為這個串連控制的class當中使用了大量的引用,所以設定一個宏IN和OUT,僅僅只是一個標誌,標記是輸出還是輸入。
這個class的設計和MysqlObj的設計非常像,但是不同的是這裡並不需要一個對象來專門儲存查詢值,就因為Redis是key-value的,查詢是直接返回一個字串或者數字。
所以這裡只需要一個成員變數來儲存查詢值,就是redisReply* r_pResult;
redisReply是定義在hiredis.h標頭檔當中的。
另外一個設計上的需求是這裡還沒有加上登陸密碼。Redis是可以設定密碼的。
和MysqlObj相比的大差距是這些函數:
public: // 從redis當中擷取傳回值 int IntegerResult(OUT long long &result); int StringResult(OUT string &result); int StatusResult(OUT string &result); int StringArrayResult(OUT vector<string> &result); int ArrayResult(OUT vector<redisReply*> &result);
同樣也是因為Redis不是關係型資料庫,所以需要對傳回值的pResult的type進行檢查。檢查之後再執行對應的函數。
#ifndef _REDIS_OBJ_H#define _REDIS_OBJ_H#include <hiredis/hiredis.h>#include <string>#include <vector>#include "debug.h"using std::string;using std::vector;// 設定一個標誌,函數參數列表當中帶有OUT的就是輸出引用,帶有IN的就是輸入參數#define OUT#define INclass RedisObj{ public: RedisObj(string HostIP, string pPassword, unsigned iPort); virtual ~RedisObj(); // Dump指的是把m_pRedis的指標指向的值列印出來 void Dump() const; string ErrorMessage(); // 根據成員變數來建立Redis串連 bool Connect(); void Close(); int ExecuteCmd(const char* pCmd); //返回Redis的指標 redisContext* get() const; public: // 從redis當中擷取傳回值 int IntegerResult(OUT long long &result); int StringResult(OUT string &result); int StatusResult(OUT string &result); int StringArrayResult(OUT vector<string> &result); int ArrayResult(OUT vector<redisReply*> &result); private: // 從redis當中擷取傳回值 int IntegerResult(OUT long long &result, IN redisReply* reply); int StringResult(OUT string &result, IN redisReply* reply); int StatusResult(OUT string &result, IN redisReply* reply); int StringArrayResult(OUT vector<std::string> &result, IN redisReply* reply); int ArrayResult(OUT vector<redisReply*> &result, IN redisReply* reply); private: // 代表了一條資料庫連接 redisContext* r_pRedis; redisReply* r_pResult; private: // 串連必備的參數:IP地址,使用者,密碼,資料庫名稱,連接埠號碼 string r_strHost; string r_strPassword; unsigned r_iPort; //錯誤資訊 string r_strErrorMessage;};#endif /* REDIS_OBJ_H */
#include "../include/redis_obj.h"#include <assert.h>#include <cstring>RedisObj::RedisObj(string host, string password, unsigned port): r_strHost(host), r_strPassword(password), r_iPort(port){ r_pRedis = NULL;}RedisObj::~RedisObj(){ Close();}void RedisObj::Dump() const{ printf("r_pRedis=%p", r_pRedis);}string RedisObj::ErrorMessage(){ return "";}bool RedisObj::Connect(){ r_pRedis = redisConnect(r_strHost.c_str(), r_iPort); if ( r_pRedis->err ) { return false; } return true;}void RedisObj::Close() { if ( r_pRedis ) { redisFree(r_pRedis); r_pRedis = NULL; }}int RedisObj::ExecuteCmd(IN const char* pCmd){ r_pResult = (redisReply*)redisCommand(r_pRedis, pCmd); if( r_pResult == NULL) { return -1; } return 0;}redisContext* RedisObj::get() const{ return r_pRedis;}int RedisObj::IntegerResult(OUT long long &result){ return IntegerResult(result, r_pResult);}int RedisObj::StringResult(OUT string &result){ return StringResult(result, r_pResult);}int RedisObj::StatusResult(OUT string &result){ return StatusResult(result, r_pResult);}int RedisObj::StringArrayResult(OUT vector<string> &result){ return StringArrayResult(result, r_pResult);}int RedisObj::ArrayResult(OUT vector<redisReply*> &result){ return ArrayResult(result, r_pResult);}// 從redis當中擷取傳回值int RedisObj::IntegerResult(OUT long long &result, IN redisReply* reply){ if(reply == NULL) return -1; if(reply->type != REDIS_REPLY_INTEGER) return -1; result = reply->integer; return 1;}int RedisObj::StringResult(OUT std::string &result, IN redisReply* reply){ if(reply == NULL) return -1; if(reply->type == REDIS_REPLY_NIL) return 0; if(reply->type != REDIS_REPLY_STRING) return -1; result.clear(); result.assign(reply->str, reply->len); return 1;}int RedisObj::StatusResult(OUT std::string &result, IN redisReply* reply){ if(reply == NULL) return -1; if(reply->type != REDIS_REPLY_STATUS) return -1; result.clear(); result.assign(reply->str, reply->len); return 1;}int RedisObj::StringArrayResult(OUT std::vector<std::string> &result, IN redisReply* reply){ if(reply == NULL) return -1; if(reply->type == REDIS_REPLY_NIL) return 0; if(reply->type != REDIS_REPLY_ARRAY) return -1; result.clear(); for(size_t i=0; i<reply->elements; i++) { redisReply* r = reply->element[i]; if(r->type == REDIS_REPLY_STRING) { result.emplace_back(r->str, r->len); } } if(result.size() == 0) return 0; return 1;}int RedisObj::ArrayResult(OUT std::vector<redisReply*> &result, IN redisReply* reply){ if(reply == NULL) return -1; if(reply->type != REDIS_REPLY_ARRAY) return -1; result.clear(); for(size_t i=0; i<reply->elements; i++) { redisReply* r = reply->element[i]; result.emplace_back(r); } if(result.size() == 0) return 0; return 1;}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
資料庫連接池DBPool分析(七):Redis串連控制 RedisObj