mysql,redis客户端连接池和线程池的Linux C编程实现(★firecat推荐★)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 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版本 -- https://github.com/redis/hiredis

#安装说明 -- 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推荐★)

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2天前
|
NoSQL 关系型数据库 MySQL
Linux安装jdk、mysql、redis
Linux安装jdk、mysql、redis
58 7
|
8天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
61 13
|
21天前
|
关系型数据库 MySQL Linux
MySQL数据库下载安装教程(Windows&Linux)
本文档详细介绍了MySQL的安装步骤,包括安装前的准备工作、下载安装包、Windows和Linux系统下的具体安装流程,以及如何配置MySQL服务、设置环境变量、启动服务和连接数据库等关键操作。
|
1月前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
64 4
|
1月前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
108 3
|
1月前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
47 3
|
1月前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
121 3
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
Ubuntu 关系型数据库 MySQL
Linux系统MySQL安装
【10月更文挑战第19天】本文介绍了在 Linux 系统上安装 MySQL 的步骤,包括安装前准备、安装 MySQL、启动 MySQL 服务、配置 MySQL 以及验证安装。适用于 Ubuntu/Debian 和 CentOS/Fedora 系统,提供了详细的命令示例。
332 1
|
2月前
|
关系型数据库 MySQL Linux
Navicat 连接 Windows、Linux系统下的MySQL 各种错误,修改密码。
使用Navicat连接Windows和Linux系统下的MySQL时可能遇到的四种错误及其解决方法,包括错误代码2003、1045和2013,以及如何修改MySQL密码。
297 0