执行一条 SQL 的流程 概述从图上可以看出 MySQL 其实分为了 Server 层和存储引擎层。Server 层负责建立连接、分析和执行 SQL;而存储引擎层负责数据的存储和提取。 一条 SQL 可以分为简单分为以下几个阶段:连接、查询缓存、解析 SQL 和执行 SQL。 连接 建立连接:客户端通过 IP、端口号、用户名、密码等信息,通过 TCP 协议连接到 MySQL Server。 管理连接:Linux 控制台中 2025-04-21 MySQL
乐观锁和悲观锁 乐观锁乐观锁认为共享资源每次被访问的时候不会出现问题,线程可以不停地执行,无需加锁也无需等待,只是在提交修改的时候去验证对应的资源是否被其它线程修改了。乐观锁可以通过版本号机制和 CAS 算法实现。 CAS V:要更新的变量值(Var) E:预期值(Expected) N:拟写入的新值(New) 当且仅当 V 的值等于 E 时,CAS 通过原子方式用新值 N 来更新 V 的值。如果不等,说明已经 2025-04-15 Java > Java并发编程
分布式事务解决方案 分布式一致性的级别 强一致性:系统写入了什么,读出来的就是什么。 弱一致性:不一定可以读取到最新写入的值,也不保证多少时间之后读取到的数据是最新的,只是会尽量保证某个时刻达到数据一致的状态。 最终一致性:弱一致性的升级版,系统会保证在一定时间内达到数据一致的状态。 CAP 一致性(Consistency) : 所有节点访问同一份最新的数据副本 可用性(Availability): 非故障的节点在 2025-04-08 分布式
JVM 的垃圾收集器 没有最好的垃圾收集器,更没有万能的垃圾收集器,我们要做的就是根据具体应用场景选择适合自己的垃圾收集器。试想一下:如果有一种四海之内、任何场景下都适用的完美收集器存在,那么我们的 HotSpot 虚拟机就不会实现那么多不同的垃圾收集器了。 不同版本 JDK 的默认垃圾收集器(使用 java -XX:+PrintCommandLineFlags -version 命令查看): JDK 8: Para 2025-04-08 Java > JVM虚拟机
JVM 的垃圾回收算法 标记-清除算法标记-清除(Mark-and-Sweep)算法分为“标记(Mark)”和“清除(Sweep)”阶段:首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象。 它是最基础的收集算法,后续的算法都是对其不足进行改进得到。这种垃圾收集算法会带来两个明显的问题: 效率问题:标记和清除两个过程效率都不高。 空间问题:标记清除后会产生大量不连续的内存碎片。 复制算法为了 2025-04-08 Java > JVM虚拟机
JVM 的对象存活判定算法 引用计数法给对象中添加一个引用计数器: 每当有一个地方引用它,计数器就加 1 当引用失效,计数器就减 1 任何时候,计数器为 0 的对象不可能再被使用 这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法来管理内存,其最主要的原因是:很难解决对象之间循环引用的问题。因为互相引用对方,导致二者的引用计数器都不为 0,于是引用计数算法无法通知 GC 回收器回收他们。 可达性分析算法这 2025-04-08 Java > JVM虚拟机
Java 线程间的通信方式 线程间通信指的是多个线程之间相互传递信息或共享资源的机制,通信是多线程编程中的重要概念,用于实现线程之间的协作和数据共享。在谈到线程间通信时,我们主要关注的是 线程间的同步和互斥。 共享变量多个线程可以通过共享变量来进行通信。共享变量可以是全局变量或类的静态变量,多个线程可以同时读取和写入这些变量,通过变量的值来进行信息传递和共享数据。共享变量一般需要搭配 volatile 关键字进行使用。 1 2025-04-07 Java > Java并发编程
TCP 传输控制协议 TCP 协议的特点:面向连接、面向字节流、可靠传输、流量控制、拥塞控制。 面向连接面向连接 是指在 TCP 通信前,通信双方必须先通过三次握手 建立连接(连接建立阶段),确保通信双方都准备好进行数据传输;在数据传输完后再通过四次挥手 关闭连接(连接释放阶段),确保双方都完成了数据的发送和接收。 TCP 连接建立后,通信双方会维护连接的状态信息,包括序列号、窗口大小等,以便进行可靠的数据传输和流量控 2025-04-03 计算机网络
谈谈 TCP 传输控制协议的特点 TCP 协议的特点:面向连接、可靠传输、基于字节流、流量控制、拥塞控制。 面向连接面向连接 是指在 TCP 通信前,通信双方必须先通过三次握手 建立连接(连接建立阶段),确保通信双方都准备好进行数据传输;在数据传输完后再通过四次挥手 关闭连接(连接释放阶段),确保双方都完成了数据的发送和接收。 TCP 连接建立后,通信双方会维护连接的状态信息,包括序列号、窗口大小等,以便进行可靠的数据传输和流量控 2025-04-03 计算机网络
MVCC 和锁是如何最大程度避免幻读的 幻读的产生举个例子,假设一个事务在 T1 时刻和 T2 时刻分别执行了下面查询语句,途中没有执行其他任何语句: 1SELECT * FROM t_test WHERE id > 100; 只要 T1 和 T2 时刻执行产生的结果集是不相同的,那就发生了幻读的问题,比如: T1 时间执行的结果是有 5 条记录,而 T2 时间执行的结果是有 6 条记录,那就发生了幻读。 T1 时间执行的结 2025-04-02 MySQL > 事务