原创 MySQL多版本併發控制——MVCC機制分析

MVCC,即多版本併發控制(Multi-Version Concurrency Control)指的是,通過版本鏈維護一個數據的多個版本,使得讀寫操作沒有衝突,可保證不同事務讀寫、寫讀操作併發執行,提高系統性能。 實際上,innodb中“讀

原创 【數據結構與算法】排序經典題總結

1.數組中的第K個最大元素 數組中的第K個最大元素 LeetCode:數組中的第K個最大元素 題目描述: 在未排序的數組中找到第 k 個最大的元素。請注意,你需要找的是數組排序後的第 k 個最大的元素,而不是第 k 個不同的元素。 示例

原创 B樹與B+樹區別辨析

我們都知道,innodb中的索引結構使用的是B+樹。B+樹是一種B樹的變形樹,而B樹又是來源於平衡二叉樹。相較於平衡二叉樹,B樹更適合磁盤場景下文件索引系統。那爲什麼B樹更適合磁盤場景,B+樹又在B樹基礎上做了什麼優化?抱着這些問題,本博客

原创 【Redis】內部數據結構自頂向下梳理

本博客將順着自頂向下的思路梳理一下Redis的數據結構體系,從數據庫到對象體系,再到底層數據結構。我將基於我的一個項目的代碼來進行介紹:daredis。該項目中,使用Java實現了Redis中所有的數據結構,思想與Redis大致類似,各種變

原创 SPI機制剖析——基於DriverManager+ServiceLoader的源碼分析

我的上一篇博客類加載器與雙親委派中提到,SPI機制是一種上級類加載器調用下級類加載器的情形,因此會打破類加載的雙親委派模型。爲了深入理解其中的細節,本博客詳細剖析一下SPI機制,並以JDBC爲例,基於源碼來進行分析。 SPI 原理介紹 SP

原创 【JVM】類加載器與雙親委派

類加載器,顧名思義,即是實現類加載的功能模塊,負責將Class的字節碼形式加載成內存形式的Class對象。字節碼文件可來源於磁盤或者jar包中的Class文件,也可以來自網絡字節流。 類加載器 在JVM中,內置了三個重要的類加載器,Appl

原创 【JVM】類加載時機與過程

虛擬機把描述類的數據從class文件加載到內存,並對數據進行校驗、轉換解析和初始化,最終形成可以被虛擬機直接使用的Java類型,這就是虛擬機的類加載機制。下面來總結梳理類加載的五個階段。 類加載發生在程序運行期間,會有一些性能開銷,但是會

原创 PriorityQueue原理分析——基於源碼

在業務場景中,處理一個任務隊列,可能需要依照某種優先級順序,這時,Java中的PriorityQueue(優先隊列)便可以派上用場。優先隊列的原理與堆排序密不可分,可以參考我之前的一篇博客: 堆排序總結與實現 原理 PriorityQueu

原创 Java線程池原理及分析

線程池是很常用的併發框架,幾乎所有需要異步和併發處理任務的程序都可用到線程池。 使用線程池的好處如下: 降低資源消耗:可重複利用已創建的線程池,降低創建和銷燬帶來的消耗; 提高響應速度:任務到達時,可立即執行,無需等待線程創建; 提高線程

原创 【數據結構與算法】揹包問題總結梳理

揹包問題總結分析 揹包問題是個很經典的動態規劃問題,本博客對揹包問題及其常見變種的解法和思路進行總結分析 01揹包 問題介紹 有 N 件物品和一個容量是 V 的揹包。每件物品只能使用一次。 第 i 件物品的體積是 v[i],價值是 w[i]

原创 Redis網絡模型的源碼分析

Redis的網絡模型是基於I/O多路複用程序來實現的。源碼中包含四種多路複用函數庫epoll、select、evport、kqueue。在程序編譯時會根據系統自動選擇這四種庫其中之一。下面以epoll爲例,來分析Redis的I/O模塊的源碼

原创 java反射使用總結

java反射使用總結 獲取類對象 (1)【Source源代碼階段】 Class.forName("全類名"):將字節碼文件加載進內存,返回Class對象 多用於配置文件,將類名定義在配置文件中。讀取文件,加載類。 (2)【Class類對象階

原创 信件錯排問題分析(動態規劃)

問題描述 有 N 個信件和信箱,每封信件對應一個正確信箱位置。現在它們被打亂,求錯誤裝信方式的數量。保證每一封信都裝在錯誤的位置。 思路 抽象成動態規劃問題 定義一個數組dp[]存儲錯誤方式數量。dp[i]表示,有i封信、i個信箱情況下的錯

原创 【數據結構與算法】堆排序總結與實現

本博客總結學習堆排序算法,以一個數組爲例,採用大根堆進行升序排序,附有代碼實現。 堆排序的思想 堆排序的邏輯是建立在完全二叉樹的基礎上。 有兩個概念必須要瞭解: 大根堆:每個結點值都大於等於左右孩子結點值 小根堆:每個結點值都小於等於左右

原创 【數據結構與算法】數組與矩陣經典題

1.移動零 2.重塑矩陣 移動零 五星 LeetCode:移動零 題目描述: 給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。 示例: 輸入: [0,1,0,3,12] 輸出: [1,3,1