RocketMQ 和 Kafka 索引设计比较 概述索引,是存储设计的关键,一个好的索引,应该能够在最短的时间里,找到你想要的数据,同时,还能尽量少的使用内存或磁盘空间。 今天不谈 MySQL 或者 NoSQL 这些数据库索引,谈谈相对而言较为简单的 MQ 索引。通过研究 MQ 的索引,看看他们为何如此设计,我们又有哪些借鉴之处。 RocketMQRocketMQ 的数据文件属于混合存储,即,所有的 topic 数据都放在一个文件里,因此,读数 2019-11-15 Message Queue
RocketMQ 线程模型分析 前言RocketMQ 是个消息服务器,也是个网络服务器。 本文,将从网络 IO 模型,线程模型,看看 RocketMQ 是如何设计的。 IO 模型IO 模型这块其实没什么好说的,这里稍微展开一下。 RocketMQ 使用了 Netty 作为网络通信框架,自然而然使用了 Ractor 模型,或者说 Select 模型、Epoll 模型。即一个线程管理 N 个 Socket 的模式,此模式可管理海量连 2019-11-13 Message Queue
Raft 总结思维导图 XMind 源文件https://github.com/stateIs0/api/blob/master/api-source/Raft.xmind EOF 2019-11-01 分布式
Java sendFile 底层实现 前言Java send file api 是 transferTo 方法和 transferFrom 方法。 注意:send file 是一个从磁盘到网卡驱动的 IO 优化。反过来,网卡到磁盘,是没有这个 IO 优化的。也就是说 transferFrom 方法并没有这种福利。 本文将稍稍深入,看看 Java 如何实现,注意,本文代码版本为 openjdk-8u40-src-b25-10_feb_2 2019-10-30 Java 性能优化
如何编写一个 SendFile 服务器和客户端 前言之前讨论零拷贝的时候,我们知道,两台机器之间传输文件,最快的方式就是 send file,众所周知,在 Java 中,该技术对应的则是 FileChannel 类的 transferTo 和 transferFrom 方法。 在平时使用服务器的时候,比如 nginx ,tomcat ,都有 send file 的选项,利用此技术,可大大提高文件传输效能。 另外,可能也有人谈论 send fil 2019-10-29 Java 性能优化
递归时间复杂度 递归树 推演计算 递归时间复杂度 递归树 推演计算递归的时间复杂度计算较为麻烦。以下我们使用归并排序的例子,对递归复杂度进行推演。 假设现在有一个归并排序。他的运行总时间是 T(n),我们通过将其分解成 2 个子任务,即 :2 * (T(n/2))+ n,为什么加 n 呢?因为 n/2 只是递归计算的时间,实际还有合并的时间,在大部分递归中,不但有分解子任务的时间,还有合并子任务的时间也要计算(在递归计算中,子问题 2019-10-19 算法
归并排序 归并排序 分治是一种思路。 递归是一种技巧。 分治算法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解来建立原问题的解。 分治模式在每层递归时都有 3 个步骤: 分解,分解原问题为子问题。这些子问题是原问题的规模较小的实例。 解决,递归的求解子问题。 合并。合并子问题的解为原问题的解。 归并排序归并排序完全遵循分治思想。操作如下: 分 2019-10-19 算法
插入排序 插入排序插入排序,如果你打过扑克,你就会非常熟悉:当我们摸排的时候,第一张牌是 8,第二张牌如果是 7,我们会放在 8 的前面,否则会放到后面。插入排序和这个非常类似。 我们将数组中的元素,分成“已排序区间”和“未排序区间”。 刚开始的时候,已排序区间的个数是 1. 我们从 2 开始,从右往左进行比较,如果后面的较小,就进行交换,直到后面的数字比前面的数字大,就停止比较。 如下图所示: 在第四次 2019-10-19 算法
选择排序 选择排序核心思想:将数据分为 “未排序区间” 和 “已排序区间”,每次在“未排序区间”找到最小的元素,追加到已排序区间的末尾。 如下图所示: 初始数组 「4,5,2,1,3」; 初始,未排序区间大小为 0, 从 0 开始,遍历数组,找到最小元素,放在 0 的位置。 第二次,从下标 1 开始,找最小的元素,放到 1 的位置。 ….. 代码: 1234567891011121314151617181 2019-10-19 算法
排序算法要素 几种排序算法 还有希尔排序,堆排序等。 当然还有其他冷门排序:猴子排序,睡眠排序,面条排序。 如何分析一个排序算法?1. 排序算法的执行效率—— 时间复杂度要更精细 最好情况、最坏情况、平均时间复杂度,为什么要分析这么多种呢?因为数据的不同,算法的执行效果也不同。例如有点数据完全无序,有的数据接近有序。 时间复杂度的系数、常数、低阶。我们知道,我们之前分析复杂度的时候,会忽略这 3 个元素,只需要 2019-10-19 算法
排序算法——冒泡排序 冒泡排序大部分人学习排序的第一个算法,就是冒泡排序。 简单来说,冒泡排序就是每次迭代,都会检查相邻的 2 个元素大小,如果左边比右边大,就交换顺序(升序),这样,第一轮下来,一定会把最大的那个值放到最右边。到第二轮的时候,也同样会把未排序的最大的数字,放到倒数第二的位置…….. 第一轮排序,如下图: 解释一下上图,左边是排序次数,一共 5 次。 从最下面开始冒泡,i 从 0 开始,每次比 2019-10-19 算法
快速排序 简述快排是排序算法中绕不开的关键一环,其中涉及到分治算法,二分查找等关键知识。 本文内容: 快排原理 代码实现 分区过程图示 <啊哈算法> 中的另一种实现 复杂度 优化 快排原理快排也归并类似,也使用了分治的思想,即将原序列划分成 2 份,然后继续递归。但是他们的区别是: 归并的划分是简单的通过找中位下标进行,他的公式是 $mid = \frac {(low + high)}2$快 2019-10-19 算法