木西笔记

个人博客

数据库原理篇(2)

InnoDB 的数据存储方式

InnoBD 的数据结构 InnoBD 中的数据结构概览 先来看一下 InnoDB 中的整体存贮逻辑 MySQL 使用 InnoDB 存储表时,会将表的定义和数据索引等信息分开存储,其中前者存储在 .frm 文件中,后者存储在 .ibd 文件中,这一节就会对这两种不同的文件分别进行介绍。 .frm 文件 无论在 MySQL 中选择了哪个存储引擎,所有的 MySQL 表都会在硬盘上创建一个 ...

kafka系列

Kafka 原理分析

Kafka概述 Kafka 定义 Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于 大数据实时处理领域。 消息队列好处 可以参考我的另一篇博文MQ可以解决哪些实际问题 优缺点 优点: 可扩展。Kafka集群可以透明的扩展,增加新的服务器进集群。 高性能。Kafka性能远超过传统的ActiveMQ、RabbitMQ等,Kafka支持Batc...

数据库原理篇(1)

索引的实现原理

索引概诉 索引详解 常见的索引算法 平衡二叉树索引 二叉树的查找的时间复杂度是O(log2N),其查找效率与深度有关,而普通的二叉树可能由于内部节点排列问题退化成链表,这样查找效率就会很低。因此平衡二叉树是更好的选择,因为它保持平衡,即通过旋转调整结构保持最小的深度。其查找的时间复杂度也是O(log2N)。 但实际上,数据库中索引的结构也并非AVL树或更优秀的红黑树,尽管它的查询的时间复...

TCP/IP系列(3)

TCP连接的状态详解

TCP 状态 一个TCP连接在它的生命周期内会有不同的状态。 TCP状态图 状态 描述 LISTEN 等待来自远程TCP应用程序的请求 SYN_SE...

JAVA多线程之深入分析synchronized原理和锁膨胀过程

synchronized概述 synchronized 是锁同步的一个关键字,这里主要讲解这个关键的概念性的东西,不做扫盲。 特性 可见性 有序性 可见性 原子性 synchronized 优化历史 锁膨胀详解 前言 上一篇文章介绍了多线程的概念及synchronized的使用方法《synchronized的使用(一)》,但是仅仅会用还是不够的,只有了解其底层实现才能在开发过程中运筹帷幄...

JAVA多线程之AQS分析(2)

CountDownLatch的分析来解读AQS的共享功能。

AQS 共享功能的实现 CountDownLatch 的用法 CountDownLatch,CountDownLatch 为 java.util.concurrent 包下的计数器工具类,常被用在多线程环境下,它在初始时需要指定一个计数器的大小,然后可被多个线程并发的实现减 1 操作,并在计数器为 0 后调用 await 方法的线程被唤醒,从而实现多线程间的协作。它在多线程环境下的基本使用方...

JAVA多线程篇之锁的介绍

概述 这篇文章介绍各种锁的分类。介绍的内容如下: 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享锁 互斥锁 / 读写锁 乐观锁 / 悲观锁 分段锁 偏向锁 / 轻量级锁 / 重量级锁 自旋锁 上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。 锁的种类详解 公平锁 / 非公平锁 公平锁 公平...

操作系统之 高性能IO浅析

IO模型分类 (1)同步阻塞IO(Blocking IO):即传统的IO模型。 (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。 (3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO...

操作系统之Epoll原理

Epoll 很重要,但是 Epoll 与 Select 的区别是什么呢?Epoll 高效的原因是什么? 从网卡接收数据说起 网卡接收数据的过程 下边是一个典型的计算机结构图,计算机由 CPU、存储器(内存)与网络接口等部件组成,了解 Epoll 本质的第一步,要从硬件的角度看计算机怎样接收网络数据。 下图展示了网卡接收数据的过程: 在 1 阶段,网卡收到网线传来的数据。 经过 2 阶段的...

Java内存模型(1)

JMM是什么

为什么要有内存模型 CPU缓存 我们应该都知道,计算机在执行程序的时候,每条指令都是在CPU中执行的,而执行的时候,又免不了要和数据打交道。而计算机上面的数据,是存放在主存当中的,也就是计算机的物理内存。 当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到...