天天看點

mysql,redis用戶端連接配接池和線程池的Linux C程式設計實作(★firecat推薦★)

一、環境準備:

CentOS7,CMake編譯器

Mysql使用官方c語言版本用戶端,不使用c++庫,因為c++庫依賴boost庫

Linux安裝mysql時,有這個包,mysql-community-devel-5.7.18-1.el7.x86_64.rpm -- 裡面内容是c語言版本的用戶端庫函數和頭檔案

https://downloads.mysql.com/archives/community/ Redis使用自帶的hiredis庫,也是c語言實作 https://github.com/antirez/redis/tree/unstable/deps/hiredis https://github.com/redis/hiredis 二、完整的工程源碼: https://download.csdn.net/download/libaineu2004/10300017

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

#工程主要參考TeamTalk

#https://github.com/meili/TeamTalk/tree/master/server/src/db_proxy_server

PROJECT(mysqlredis_pool)

AUX_SOURCE_DIRECTORY(. SRC_LIST)

#mysql用戶端,我們不使用c++版本,因為它依賴boost庫,太啰嗦

#mysql-connector-c++-1.1.8-linux-el7-x86-64bit.tar.gz --

https://downloads.mysql.com/archives/c-cpp/ #推薦使用c版本 -- https://downloads.mysql.com/archives/c-c/

#mysql-community-devel-5.7.18-1.el7.x86_64.rpm 自帶了c語言用戶端頭檔案和庫

#安裝說明 --

http://blog.csdn.net/libaineu2004/article/details/76212125

SET(MYSQL_INCLUDE_DIR /usr/include/mysql)

SET(MYSQL_LIB /usr/lib64/mysql)

#redis用戶端,使用c版本 --

http://blog.csdn.net/libaineu2004/article/details/76209267

SET(REDIS_INCLUDE_DIR /usr/local/include/hiredis/)

SET(REDIS_LIB /usr/local/lib/)

INCLUDE_DIRECTORIES(${MYSQL_INCLUDE_DIR} ${REDIS_INCLUDE_DIR})

LINK_DIRECTORIES(${MYSQL_LIB} ${REDIS_LIB})

#ADD_EXECUTABLE必須在TARGET_LINK_LIBRARIES前面,否則會報錯

ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_LIST})

TARGET_LINK_LIBRARIES(${PROJECT_NAME} mysqlclient hiredis pthread)

main.cpp

#include "DBPool.h"
#include "CachePool.h"
#include "ThreadPool.h"
#include "ProxyTask.h"
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <fcntl.h> //daemonize
#include <string>
#include <string.h>
 
void handler(uint32_t conn_uuid)
{
    printf("hello,%d\n", conn_uuid);
 
    CDBManager* pDBManger = CDBManager::getInstance();
    if (!pDBManger) {
        printf("DBManager init failed");
        return;
    }
 
    CDBConn* pDBConn = pDBManger->GetDBConn("teamtalk_master");//get a db conn
    if (pDBConn) {
        string strSql = "select * from IMUser";
        CResultSet* pResultSet = pDBConn->ExecuteQuery(strSql.c_str());
        if (pResultSet)
        {
            delete pResultSet;
        }
 
        pDBManger->RelDBConn(pDBConn);//注意,con用完之後一定要記得歸還,ReleaseConnection
    }
}
 
int main(int argc, char* argv[])
{
    signal(SIGPIPE, SIG_IGN);
 
    //案例1,僅僅使用mysql連接配接池,不使用線程池
    CDBManager* pDBManger = CDBManager::getInstance();
    if (!pDBManger) {
        printf("DBManager init failed");
        return -1;
    }
 
    CDBConn* pDBConn = pDBManger->GetDBConn("teamtalk_master");//get a db conn
    if (pDBConn) {
        string strSql = "select * from IMUser";
        CResultSet* pResultSet = pDBConn->ExecuteQuery(strSql.c_str());
        if (pResultSet)
        {
            string strResult, strSalt;
            uint32_t nId, nGender, nDeptId, nStatus;
            string strNick, strAvatar, strEmail, strRealName, strTel, strDomain,strSignInfo;
            while (pResultSet->Next()) {
                nId = pResultSet->GetInt("id");
                strResult = pResultSet->GetString("password");
                strSalt = pResultSet->GetString("salt");
                strNick = pResultSet->GetString("nick");
                nGender = pResultSet->GetInt("sex");
                strRealName = pResultSet->GetString("name");
                strDomain = pResultSet->GetString("domain");
                strTel = pResultSet->GetString("phone");
                strEmail = pResultSet->GetString("email");
                strAvatar = pResultSet->GetString("avatar");
                nDeptId = pResultSet->GetInt("departId");
                nStatus = pResultSet->GetInt("status");
                strSignInfo = pResultSet->GetString("sign_info");
            }
 
            delete pResultSet;
        }
 
        pDBManger->RelDBConn(pDBConn);//注意,con用完之後一定要記得歸還,ReleaseConnection
    }
 
    //案例2,使用mysql連接配接池,也使用線程池
    //top -H -p <pid> 終端檢視某個特定程序<pid>并檢查該程序内運作的線程狀況
    CThreadPool thread_pool;
    thread_pool.Init(10);
 
    CTask* pTask1 = new CProxyTask(1, handler);//void CWorkerThread::Execute()執行完任務會删除指針CTask*
    thread_pool.AddTask(pTask1);
    CTask* pTask2 = new CProxyTask(2, handler);
    thread_pool.AddTask(pTask2);
    CTask* pTask3 = new CProxyTask(3, handler);
    thread_pool.AddTask(pTask3);
 
    //案例3,僅僅使用redis連接配接池,不使用線程池
    CacheManager* pCacheManager = CacheManager::getInstance();
    if (!pCacheManager) {
        printf("CacheManager init failed");
        return -1;
    }
 
    CacheConn* pCacheConn = pCacheManager->GetCacheConn("redis");
    if (pCacheConn)
    {
        string strVal = "sodesiname";
        pCacheConn->set("total_user_update", strVal);
        string str = pCacheConn->get("total_user_update");
        printf("%s\n", str.c_str());
        pCacheManager->RelCacheConn(pCacheConn);
    }
 
    //程序挂起,等待任務執行完成
    printf("\ninput:\n");
    char s[20];
    gets(s);  //等待輸入字元串直到回車結束
 
    return 0;
}

      

姊妹篇:

mysql,redis用戶端連接配接池和線程池的Windows C/C++程式設計實作(★firecat推薦★)