Nov 06 2025
杜若 -
MySQL 事務詳解
MySQL 事務
數據庫事務指的是一組數據操作,事務內的操作要麼就是全部成功,要麼就是全部失敗,如果部分成功,那麼已成功的必須回滾,恢復數據的原始狀態。
假設一個網購付款的操作,用户付款後要涉及到訂單狀態更新、扣庫存以及其他一系列動作,這就是一個事務,如果一切正常那就相安無事,一旦中間有某個環節異常,那整個事務就要回滾,總不能更新了訂單狀態但是不扣庫存吧,這問題就大了。
事務具有原子性(Atomi
MySQL
,
事務
Nov 06 2025
杜若 -
Netty源碼解析-請求處理與多路複用
摘要
Netty源碼系列-NioEventLoop
1.1 Netty給Channel分配Nio Event Loop的規則
看下圖,EventLoopGroup是線程組,每個EventLoop是一個線程,那麼線程處理請求是怎麼分配的呢?我們看一下源碼
1.1.1 MultithreadEventLoopGroup.register方法
該方法是EventLoop註冊Channel的方法,
netty
Nov 06 2025
杜若 -
Netty源碼解析-零拷貝
摘要
Netty源碼系列-Netty如何使用零拷貝
1、零拷貝
Netty為了加快文件傳輸速度,採用了零拷貝技術。
sendFile(Kafka也是用該技術優化性能):發送文件描述符,如果硬件支持,圖二的文件緩衝區和Socket緩衝區可以共享,只需要兩次DMA拷貝就可以
1.1 、源碼DefaultFileRegion.transferto()方法
我們看一下源碼,Netty的文件傳
netty
Nov 06 2025
杜若 -
Netty對處理粘包和半包的支持
1.1 什麼是粘包拆包
例如:發送 ABC, DEF兩個報文
收到ABCDEF一個報文,發生了粘包
收到AB,C,DEF三個報文,ABC發生了拆包
收到AB,CD,EF三個報文,即發生了拆包又發生了粘包
1.2 看一個粘包半包樣例
客户端每次把消息“ABC,DEF,GHI,JKL,MNO\n" 發生一百次給服務端
服務端將每次收到的消息輸出,並記錄收到的次數,然後將消息返回客户端
netty
Nov 06 2025
杜若 -
Netty與網絡編程
要了解Netty,必須先了解網絡編程
1 網絡編程
1.1 網絡IO模型
1.1.1 網絡三種I/O模型分類:
BIO:(同步 阻塞)jdk1.4以前 java.io包
NIO:(同步 非阻塞)jdk1.4 java.nio包
AIO:(異步 非阻塞)jdk1.7 java.nio包
1.1.2 BIO、NIO、AIO處理模式
1)BIO:一個連接一個線程,客户端有連接請求時服務器端
netty
Nov 06 2025
杜若 -
Netty源碼解析-底層原理及IO模式
1、Netty源碼編譯
我們看一下版本4.1.40.Final-SNAPSHOT源碼包,可以把源碼pull到本地,用IDEA打開。
github地址:https://github.com/netty/netty
包含的模塊如下圖:
2、Netty 源碼核心包
2.1 Netty源碼核心包主要分成下面幾塊:
1、工具類
下圖紅色的模塊,如buffer、common、resolver
2、底層協議(
netty
Nov 06 2025
杜若 -
Netty源碼解析-零拷貝
這是Netty的一個重要優化,為了解決I/O操作速度影響性能,採用零拷貝的技術
1、零拷貝
sendFile(Kafka也是用該技術優化性能):發送文件描述符,如果硬件支持,圖二的文件緩衝區和Socket緩衝區可以共享,只需要兩次DMA拷貝就可以
1.1 源碼DefaultFileRegion.transferto()方法
我們看一下源碼,Netty的文件傳輸零拷貝方法就是該方法,方法下面圈出來
netty
Nov 06 2025
杜若 -
Netty源碼解析-鎖機制
為了提高性能,Netty對鎖也做了大量優化
1、鎖優化技術
Netty大量使用了鎖優化技術:
1.1 減小鎖粒度
1.2 減少鎖對象的空間佔用
1.3 提高鎖的性能
1.4 根據不同業務場景選擇合適鎖
1.5 能不用鎖則不用鎖
1.1 減小鎖粒度
在Netty4.1.15.Final版本中ServerBootstrap.init方法中有兩個地方對對象加鎖,而不是在方法上加一個大鎖,縮
netty
Nov 06 2025
杜若 -
Netty源碼解析-響應式實現(Reactor模式)
Netty基本介紹,請參考juejin.cn/post/740884…
1、Netty如何支持Reactor模式
1.1 主從Reactor模式
實現這種模式需要定義兩個EventLoopGroup,bossGroup就是mainReactor, workerGroup就是subReactor,
接着我們進入下圖的b.group方法
1.1.2 進入ServerBootstrap.group方
netty
Nov 06 2025
杜若 -
Netty源碼解析-請求處理與多路複用
NioEventLoop是什麼?
如圖,NioEventLoop是worker threads中的thread,也就是處理請求的線程,屬於NioEventLoopGroup,那麼多個線程每次選擇哪個線程來處理請求呢?
1.1 Netty給Channel分配Nio Event Loop的規則
看下圖,EventLoopGroup是線程組,每個EventLoop是一個線程,那麼線程處理請求是怎麼分配
netty
Nov 06 2025
杜若 -
Netty源碼-責任鏈模式運用
Netty基本介紹,參考juejin.cn/post/740884…
1、Netty的責任鏈模式
1.1 責任鏈模式實現樣例
基於上圖,寫一個責任鏈模式的案例如下:
從下面的例子我們可以知道,責任鏈模式包含下面幾個重要的部分:
HandlerChainContext:hander上下文,也就是責任鏈中的節點,持有一個handler,並有指向下一個節點的指針
Handler: 責任處理器
netty
Nov 06 2025
杜若 -
Netty源碼-業務流程之讀事件
Netty基本介紹,參考 https://juejin.cn/post/7408844429370834954
1 Netty讀事件
1.1 READ事件,NioEventLoop#processSelectedKey在第二次循環的時候就是讀事件
現在unsafe類不一樣,NioSocketChannel$NioSocketChannelUnsafe類,進入Read方法,我們進入了Abstarc
netty
Nov 06 2025
杜若 -
Netty源碼-Server啓動流程
Netty基本介紹,參考 https://juejin.cn/post/7408844429370834954
1、主線程:
Netty源碼包的mnetty-example模塊隨便打開一個實現樣例,比如包io.netty.example.echo下的EchoServer,我們從這裏的源碼開始看
Server啓動流程: 創建Selector -》創建ServerSocketChannel -》 初始
netty
Nov 06 2025
杜若 -
Netty源碼-業務流程之寫數據
Netty基本介紹,參考 Netty與網絡編程
1、源碼分析,EchoServerHandler之Write流程
1.1 write流程入口
通常我們通過ChannelRead收到消息後,需要給一個響應,通過ctx.write()將響應返回客户端。
在自定義handler的channelRead方法打一個斷點,客户端發起請求,並進入ctx.write
1.2 AbstractChannelHa
netty
,
nio
Nov 06 2025
杜若 -
Netty源碼-業務流程之構建連接
Netty基本介紹,參考 https://juejin.cn/post/7408844429370834954
1、Netty構建連接
構建連接的流程
1.1 我們知道客户端連接服務端都是通過NioEventLoop來處理請求,NioEventLoop是一個線程,連接進來首先進入run()方法。
所以我們需要啓動服務端,然後再啓動客户端發起連接,我們在run()方法打個斷點看一下。
從ru
netty
Nov 06 2025
杜若 -
Netty源碼-業務流程之請求處理
1、業務處理流程
1.1 主從模型
1.2 Debug跟蹤
我們用Netty源碼包下面的example來Debug觀察一下,包路徑io.netty.example.echo
NioEventLoop#processSelectedKeysOptimized()方式循環處理不同的事件。如下圖。
NioEventLoop#processSelectedKey方法處理一個事件,在該方法中的un
netty
Sep 11 2024
杜若 -
分佈式鎖實現
1、redis分佈式鎖
redis 最普通的分佈式鎖
加鎖: 第一個最普通的實現方式,就是在 redis 裏使用setnx命令創建一個 key,這樣就算加鎖。
SET resource_name my_random_value NX PX 30000
解鎖: 用下面的lua腳本保證原子性
if redis.call('get', KEYS[1]) == ARGV[1] then
redis
,
分佈式鎖
,
鎖
Jul 13 2024
杜若 -
Java鎖優化之批量重偏向
1. Java鎖的重偏向機制
1.1 偏向鎖機制
我們知道,當我們使用synchronized關鍵字的時候,一個對象a只被一個對象訪問的時候,對對象加的鎖偏向鎖,如果之後出現第二個線程訪問a的時候(這裏只考慮線程交替執行的情況,不存在競爭),不管線程1是已死亡還是運行狀態,此時鎖都會升級為輕量鎖,並且鎖升級過程不可逆。
1.2 批量重偏向
但是如果有很多對象,這些對象同屬於一個類(假設是類A)被線
鎖
,
synchronized