資料庫連接池DBPool分析(七):Redis串連控制 RedisObj

來源:互聯網
上載者:User

標籤:

因為這個串連控制的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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.