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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 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
相关文章
|
8天前
|
缓存 NoSQL 关系型数据库
13- Redis和Mysql如何保证数据⼀致?
该内容讨论了保证Redis和MySQL数据一致性的几种策略。首先提到的两种方法存在不一致风险:先更新MySQL再更新Redis,或先删Redis再更新MySQL。第三种方案是通过MQ异步同步以达到最终一致性,适用于一致性要求较高的场景。项目中根据不同业务需求选择不同方案,如对一致性要求不高的情况不做处理,时效性数据设置过期时间,高一致性需求则使用MQ确保同步,最严格的情况可能涉及分布式事务(如Seata的TCC模式)。
35 6
|
9天前
|
NoSQL Linux Redis
linux 下和win下安装redis 并添加开机自启 图文详解
linux 下和win下安装redis 并添加开机自启 图文详解
15 0
|
1月前
|
NoSQL 关系型数据库 MySQL
分布式锁(redis/mysql)
分布式锁(redis/mysql)
55 1
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
99 1
|
1月前
|
NoSQL Linux Redis
Linux系统中安装redis+redis后台启动+常见相关配置
Linux系统中安装redis+redis后台启动+常见相关配置
|
29天前
|
关系型数据库 MySQL 数据库
rds安装数据库客户端工具
安装阿里云RDS的数据库客户端涉及在本地安装对应类型(如MySQL、PostgreSQL)的客户端工具。对于MySQL,可选择MySQL Command-Line Client或图形化工具如Navicat,安装后输入RDS实例的连接参数进行连接。对于PostgreSQL,可以使用`psql`命令行工具或图形化客户端如PgAdmin。首先从阿里云控制台获取连接信息,然后按照官方文档安装客户端,最后配置客户端连接以确保遵循安全指引。
81 1
|
9天前
|
NoSQL Linux PHP
php添加redis扩展 linux和windos图文详解 l
php添加redis扩展 linux和windos图文详解 l
3 0
|
17天前
|
NoSQL Linux Redis
Linux安装Redis
Linux安装Redis
26 0
|
28天前
|
数据可视化 关系型数据库 MySQL
PolarDB常见问题之无法创建mysql的连接池如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
30天前
|
NoSQL 关系型数据库 MySQL
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
188 0