KANG's BLOG

Let's have some fun

代码评审规范

评审目的 代码评审的目的就是为了保证公司整体代码的健康状况随着不断迭代,始终保持一个较高的水平,所有在评审中使用的工具和流程都应是为此目的而设计的。 评审原则 鼓励质疑 保持代码风格,遵守开发规范 优先设计原则,尊重个人偏好 重视每一行代码 尽可能采用面对面的形式 评审时机 研发流程应该是严密的、有节奏的,而个体的代码质量会影响整体交付进度,所以请第一时间启动代码评审,最晚不要超过早期测试阶段。

通过构建可观测性进行故障治理

1 可观测性 1.1 什么是可观测性 可观察性(observability)是指系统可以由其外部输出推断其其内部状态的程度。 — 「wikipedia - 可观测性」 在微服务架构盛行的当下,支撑一条业务所涉及的系统多、链路长,很多时候系统对我们来说就像一个黑盒,出现问题时,我们根本就无从下手。

JVM常见问题排查方案

一、主动分析 1. 分析CPU占用高的情况 查看CPU占用情况 top 查看具体占用CPU的线程 top -H -p <pid>

InnoDB中普通索引和唯一索引的区别

InnoDB中的索引都是一颗颗的B+树,普通索引和唯一索引在使用上差别在于保证索引的唯一性。 二者差别主要体现在普通索引能够通过change buffer来提高更新时的性能。 1. change buffer 使用方式 普通索引如果数据在内存中则会直接更新内存,否则将该操作缓存在change buffer中。 当下次查询需要访问这个数据页时,将这个数据页读入内存,然后执行change buffer中与这个页有关的操作。

Mysql删除数据对磁盘空间的影响

两种删除数据的场景 Mysql删除数据分两种场景,其删除数据时对磁盘的影响不同。 DROP TABLE … DROP TABLE时,会将表结构信息和数据一起删除,但这时就要看该表数据是存储在独立文件中(File-Per-Table)还是系统空间(亦称为共享表空间)中。 如果是在独立文件中,那么DROP成功后将直接删除数据,而系统空间中,即使表删掉也不会回收空间。 先来看看mysql官网上对File-Per-Table概念的解释: A file-per-table tablespace contains data and indexes for a single InnoDB table, and is stored on the file system in a single data file.

Java中Timer的底层机制

内部构成说明 Timer 定时器,其维护了一个异步线程TimerThread和一个优先队列TaskQueue,异步线程的作用就是取出任务执行,然后如果是轮训任务,在执行完之后再将其放回队列。 TimerTask 抽象类,继承了Runnable接口,表示单个任务对象,需要使用者实现任务内容。 队列的有序性保证 队列采用数组表示堆结构来保证整体有序性,堆结构的特点是平衡二叉树,任意节点(N)都小于其两个子节点(子节点分别为2N和2N+1),根据这个特性,队列增加或删除元素的方式如下: 增加元素 直接在数组后面增加元素,如果超过size(默认128)则扩容,增加元素后,不断和父元素比较上移,直到保持整个堆的有序性 删除元素 当堆顶被取走后,queue[1]需要被删除,那么将队尾元素queue[size]替换到堆顶,然后不断与其两个子节点中较小的进行交换位置,也就是说不断下沉到堆底。

InnoDB的事务和崩溃恢复

1 事务提供的安全保证 1.1 ACID特性 为保证事务(transaction)是正确可靠的,数据库引擎必须具备的四个特性: 原子性(Atomicity) 事务内的一系列操作应该是否一个整体单元,不存在中间态,或者说中间态对外不可见。 一致性(Consistency) 在ACID理论中,一致性主要是指对数据有特定的预期状态,任何数据更改必须满足这些状态约束(或者恒等条件)。但是,一致性并不是数据库自身的特性,而是通过满足原子性和隔离性而达到的效果。 隔离性(Isolation) 指代并发事务相互执行相互隔离,互不影响。

InnoDB中的锁

一、锁的类型 Mysql可以按照粒度划分为表锁和行锁 表锁范围大,上锁慢,并发低 行锁仅锁索引,上锁慢,并发高 InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。 而行锁又分为排他锁和共享锁 共享锁(S):允许获得该锁的事务读取数据行(读锁),同时允许其他事务获得该数据行上的共享锁,并且阻止其他事务获得数据行上的排他锁。 排他锁(X):允许获得该锁的事务更新或删除数据行(写锁),同时阻止其他事务取得该数据行上的共享锁和排他锁。 表锁和行锁同时存在就会带来一个问题,如果要申请表锁的时候如何确定当前表没有行锁呢?简单的方式当然是遍历查找,但这样效率太低,所以引入了“意向锁”(intention lock)。在添加行锁之前对表添加意向锁。

Java中两把锁:ReentrantLock和synchronized

Reentrantlock类 重入锁代表一段代码可以被同一个线程多次进入,其中unlock()次数对应lock()的次数。 区别于jvm实现的synchronized关键字,ReentrantLock是Lock的实现,代码层级的锁,常在finally中调用unlock()释放锁,所以在程序崩溃情况下,有可能造成死锁。 //创建一个非公平锁,默认是非公平锁 Lock nonFairLock= new ReentrantLock(); Lock nonFairLock= new ReentrantLock(false); //创建一个公平锁,构造传参true Lock fairLock= new ReentrantLock(true); 公平锁 & 非公平锁 公平锁 加锁前先查看是否有排队等待的线程,有的话优先处理排在前面的线程,先来先得。

数据库的索引类别

一、哈希索引 由于Hash查询时O(1)的特性,非常适合用来缩短查询路径。 数据插入时,不断append到一个文件中,这个文件可以是CSV,也可以是二进制格式。然后在内存中记录这条数据的K-V对,key是数据的查询键,value是数据在文档中的偏移量。 对原始数据更新也不会定位到原来的数据位置,而是将索引指向数据在文件中新追加的位置,所以文件通常采用分段的方式,不断的压缩合并,来释放磁盘空间。 并发控制 一写多读:对于文件的追加,只能有一个写线程;而由于文件不可变的特性,可以采用多线程读取的方式。 删除记录 删除数据时,实际上是一个插入动作,在数据文件中追加特殊的删除记录,也叫墓碑(tombstone),等到执行合并时,如果发现墓碑标记的key,则删除该key在数据文件中所有对应的数据。 崩溃恢复 通常会将整张哈希表的快照定时持久化到磁盘上。