MySQL为什么使用b+树 怎样的索引的数据结构是好的? MySQL 的数据是持久化的,意味着数据(索引+记录)是保存到磁盘上的,因为这样即使设备断电了,数据也不会丢失。 磁盘是一个慢的离谱的存储设备,有多离谱呢? 人家内存的访问速度是纳秒级别的,而磁盘访问的速度是毫秒级别的,也就是说读取同样大小的数据,磁盘中读取的速度比从内存中读取的速度要慢上万倍,甚至几十万倍。 磁盘读写的最小单位是扇区,扇区的大小只有 512 MYSQL 未分类 2025-02-26 qc
索引失效 对索引使用左或者左右模糊匹配 当我们使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx% 这两种方式都会造成索引失效。 比如下面的 like 语句,查询 name 后缀为「林」的用户,执行计划中的 type=ALL 就代表了全表扫描,而没有走索引。 如果是查询 name 前缀为林的用户,那么就会走索引扫描,执行计划中的 type= MYSQL 2025-02-20 qc
GMP是啥 Go语言作为一门并发编程友好的语言,采用了一种称为GMP模型的并发模型来实现高效的并发执行。GMP模型是Go语言运行时系统的核心组成部分,它负责管理goroutine的创建、调度和执行。本文将深入学习Go语言的GMP模型,包括其原理、组件和调度策略,并通过代码示例和解读来帮助读者更好地理解和应用GMP模型。 3.2 M(machine)M代表操作系统线程,它是执行goroutine的执行者。Go语 go学习总结 2025-01-30 qc
Redis实现分布式锁 1. 为什么要用分布式锁? 分布式系统下,不同的服务/客户端通常运行在独立的进程上。如果多个进程共享同一份资源的话,使用本地锁就没办法实现资源的互斥访问了。于是,分布式锁 就诞生了 分布式锁的特点: 2. 乐观锁和悲观锁 使用场景: 3.分布式锁的实现方式 常见分布式锁实现方案如下: 3.1基于Redis的实现 setnx + expire组合命令 在redis中,SETNX命令可以实现互斥,即S Redis 2025-01-17 qc
Asio多线程模型:IOServicePool 单线程和多线程对比 之前的单线程模式图如下 我们设计的IOServicePool类型的多线程模型如下: IOServicePool多线程模式特点 1 每一个io_context跑在不同的线程里,所以同一个socket会被注册在同一个io_context里,它的回调函数也会被单独的一个线程回调,那么对于同一个socket,他的回调函数每次触发都是在同一个线程里,就不会有线程安全问题,网络io层面 网络编程 2024-12-12 qc
Asio学习:有缺陷的异步服务器 Session类 Session类主要是处理客户端消息收发的会话类,为了简单起见,我们不考虑粘包问题,也不考虑支持手动调用发送的接口,只以应答的方式发送和接收固定长度(1024字节长度)的数据。 1、 _data用来接收客户端传递的数据 2、 _socket为单独处理客户端读写的socket。 3 、handle_read和handle_write分别为读回调函数和写回调函数。 接下来我们实现Se 网络编程 2024-10-21 qc
Asio学习:同步读写的客户端与服务端 客户端设计 客户端设计基本思路是根据服务器对端的ip和端口创建一个endpoint,然后创建socket连接这个endpoint,之后就可以用同步读写的方式发送和接收数据了。 服务器 session函数 创建session函数,该函数为服务器处理客户端请求,每当我们获取客户端连接后就调用该函数。在session函数里里进行echo方式的读写,所谓echo就是应答式的处理 创建线程调用session 网络编程 2024-10-20 qc
Asio学习:socket连接建立与buffer结构 网络编程基本流程 网络编程的基本流程对于服务端是这样的 服务端 1)socket----创建socket对象。 2)bind----绑定本机ip+port。 3)listen----监听来电,若在监听到来电,则建立起连接。 4)accept----再创建一个socket对象给其收发消息。原因是现实中服务端都是面对多个客户端,那么为了区分各个客户端,则每个客户端都需再分配一个socket对象进行收发 网络编程 2024-10-19 qc
c++锁的使用 本文介绍C++ 并发中使用的其他类型的锁,包括unique_lock,shared_lock, 以及recursive_lock等。shared_lock和unique_lock比较常用,而recursive_lock用的不多,或尽可能规避用这种锁。 unique_lock unique_lock和lock_guard基本用法相同,构造时默认加锁,析构时默认解锁,但unique_lock有个好处就 并发编程 2024-09-28 qc
c++并发三剑客 async用法 std::async 是一个用于异步执行函数的模板函数,它返回一个 std::future 对象,该对象用于获取函数的返回值。 以下是一个使用 std::async 的示例: 在这个示例中,std::async 创建了一个新的线程(或从内部线程池中挑选一个线程)并自动与一个 std::promise 对 并发编程 2024-09-05 qc