Clay 的技术空间

用进废退 | 艺不压身

前言

本文将基于 C++ 手写一个线程池,并分别提供 C++ 11 和 C++ 17 两种版本的线程池实现。线程池作为五大池之一(内存池、连接池、协程池、线程池、进程池),应用非常广泛,不管是客户端程序,还是后台服务程序,都是提高业务处理能力的必备模块。有很多开源的线程池实现,虽然各自接口在使用上稍有区别,但是其核心实现原理都是基本相同的。

知识背景

在基于 C++ 手写线程池之前,应该熟悉并掌握以下技术内容:

  • 熟练基于 C++ 11 的面向对象编程
  • 熟悉组合和继承、继承多态、STL 容器、智能指针、函数对象、绑定器、lambda 表达式、可变参数模板编程等。
  • 熟悉 C++ 11 多线程编程,比如线程互斥、线程同步、原子操作、CAS 等。
  • 熟悉 threadmutexunique_lockcondition_variableatomic 等。
  • 熟悉 C++ 17 和 C++ 20 的新特性,比如 C++ 17 的 any 类型和 C++ 20 的 counting_semaphore 信号量类型等。
阅读全文 »

大纲

前言

本文将剖析 SGI STL 二级空间配置器中的内存池源码,并介绍内存池的底层设计和工作原理,最后移植 SGI STL 内存池的核心源码。值得一提的是,移植后的 C++ 代码兼容 Windows 和 Linux 平台。

C++ 常见的池

在 C++ 中有五大池,包括内存池、连接池、协程池、线程池、进程池。

阅读全文 »

大纲

前言

本文将剖析 Nginx 内存池的源码,并介绍内存池的底层设计和工作原理,最后基于 C++ 移植 Nginx 内存池的核心源码。值得一提的是,移植后的 C++ 代码兼容 Windows 和 Linux 平台。

C++ 常见的池

在 C++ 中有五大池,包括内存池、连接池、协程池、线程池、进程池。

阅读全文 »

大纲

前言

本文将介绍 Muduo 网络库的使用,在使用 Muduo 之前,建议先熟悉并掌握以下技术内容:

  • 熟悉 C++ 11 语法
  • 掌握事件驱动模型(Reactor 模式)
  • 熟悉 C/C++ 多线程并发和线程安全设计
  • 熟悉 Linux 网络编程(如使用 epollsocket
阅读全文 »

大纲

前言

在 C/C++ 项目中,为了提高 MySQL Server 的访问效率,基于 C++ 11 实现数据库连接池,并使用 MySQL Connector/C++ 库。

项目背景

为了解决 MySQL 数据库(基于 C/S 设计)的访问瓶颈,除了在服务器端增加缓存服务器缓存常用的数据之外(例如 Redis),还可以增加连接池,来提高 MySQL Server 的访问效率。在高并发情况下,大量的 TCP 三次握手、MySQL Server 连接认证、MySQL Server 关闭连接回收资源和 TCP 四次挥手所耗费的性能时间也是很明显的,增加连接池就是为了减少这一部分的性能损耗。在市场上比较流行的连接池包括 C3P0、Apache DBCP、HikariCP、阿里巴巴的 Druid 连接池,它们对于短时间内大量的数据库增删改查操作性能的提升是很明显的,但是它们有一个共同点就是,全部都是由 Java 实现的。

阅读全文 »

大纲

前言

本文将介绍在三台服务器上,手动部署 Kafka-Eagle(EFAK)的集群服务,实现对 Kafka 集群的管理和监控,适用于 CentOS/Debian/Ubuntu 等发行版。

官方资源

阅读全文 »

前言

本教程将使用 Docker 安装单机版的 Seata Server、Nacos、MySQL,并实现以下配置目标:

  • (1) 配置 Seata Server 使用 Nacos 作为注册中心
  • (2) 配置 Seata Server 使用 Nacos 作为配置中心
  • (3) 配置 Nacos 将配置信息存储(持久化)到 MySQL 中
  • (4) 基于 Nacos 配置中心,配置 Seata Server 使用 MySQL 数据库来存储全局事务会话信息
阅读全文 »

大纲

前言

本文将介绍在 SpringBoot 项目中,如何基于 Redis + Lua 脚本 + AOP + 反射 + 自定义注解自研分布式限流组件,且支持拔插式使用。由于篇幅有限,下面使用的是 Redis 单机服务,若是在生产环境,为了保证系统的可用性,建议部署 Redis 集群,并使用 Redisson 作为 Redis 的客户端,这里不再累述。

阅读全文 »

大纲

MySQL 锁的介绍

锁的类型

在 MySQL 中,锁机制可以用来解决事务并发问题。MySQL 的锁有以下几种类型:

  • 按锁的粒度可以分为:
    • 行锁:锁住某行数据,锁粒度最小,并发度高。开销大,加锁慢,会出现死锁。
    • 表锁:锁住整张表,锁粒度较大,并发度低。开销小,加锁快,不会出现死锁。
    • 间隙锁:锁住的是一个区间。
    • 全局锁:锁住整个数据库,锁粒度最大。
阅读全文 »