精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

基于 Netty 的 Lettuce 居然是這樣解析RESP協議的

開發 前端
既然 Lettuce 基于 Netty 實現,那么它必然在 ChannelHandler 上動手腳,直接搜索可以發現有 9 個實現類。

今天來分享 Lettuce —— 基于 Netty 實現,Springboot2 中默認的 redis 客戶端。

那它是不是直接用 Netty 中的那幾個 handler 來處理 RESP 協議的呢?一起看看吧。

可以看到這里并沒有 codec-redis 模塊,所以 Lettuce 并沒有使用 Netty 提供的 redis 模塊。

圖片圖片

(⊙﹏⊙),問題解決得太快了,那就再來思考下,它是怎么做的呢?

既然 Lettuce 基于 Netty 實現,那么它必然在 ChannelHandler 上動手腳,直接搜索可以發現有 9 個實現類。

圖片圖片

這里我關心的就是它怎么編解碼,所以直接來看 CommandEncoder 和 CommandHandler 。

打上斷點,使用測試例子直接 debug。

代碼

@Test
    void redisTest() {
        // 創建 redis 客戶端
        RedisClient redisClient = RedisClient.create("redis://123456@192.168.200.128:6379/0");
        // 創建 channel
        StatefulRedisConnection<String, String> connection = redisClient.connect();
        // 使用 sync 同步命令
        RedisCommands<String, String> syncCommands = connection.sync();

        String name = syncCommands.get("name");
        System.out.println(name);
//        syncCommands.set("key", "Hello, Redis!");

        connection.close();
        redisClient.shutdown();
    }

剛開始時,要和服務器建立連接,發送數據,涉及到 encode 流程。

CommandHandler

圖片圖片

如圖,直接來到 nioEventLoop 線程,并調用了 write 方法。

write:382, CommandHandler (io.lettuce.core.protocol)

從右邊可以看到,發了一個 HELLO 的命令出去,其中 CommandArgs 如下:

CommandArgs [buffer=$1
3
$4
AUTH
$7
default
$6
123456
]

CommandArgs?

直接來到 toString 方法,可以發現 encode 方法。

圖片圖片

如圖,有 4 個 SingularArgument:

圖片圖片

看看他們是怎么 encode 的 。

ProtocolKeywordArgument

圖片圖片

StringArgument

圖片圖片

對比 Netty

圖片圖片

貌似沒啥大的區別,可以看到 Lettuce 中,對 ByteBuf 的使用比較粗一些,Netty 中會計算這個 ByteBuf 的初始容量,而 Lettuce 就簡單些處理,直接 singularArguments.size() * 10 。

還有一個 大小端序 的處理,只能說 Netty 太細了。

圖片圖片

CommandEncoder

直接 F9 來到這一個斷點。

圖片圖片

繼續 debug ,會來到 Command 類,在這里完成對發送數據的 encode。

圖片圖片

解析下要發送的數據。

圖片圖片

小結

那么到了這里,我們就了解完 encode 的實現了。

核心:CommandArgs 中的各種 SingularArgument

圖片圖片

下面就是接受服務器數據,進行 decode 的流程了。

CommandHandler

來到 channelRead 。

圖片圖片

decode 時,會調用到 RedisStateMachine 的 decode ,它是這個流程的核心。

圖片圖片

RedisStateMachine?

Redis 狀態機:

圖片圖片

這里我直接 copy 了一份 。

static class State {

    // Callback interface to handle a {@link State}.
    @FunctionalInterface
    interface StateHandler {
        Result handle(RedisStateMachine rsm, State state, ByteBuf buffer, CommandOutput<?, ?, ?> output,
                Consumer<Exception> errorHandler);
    }

    enum Type implements StateHandler {

        SINGLE('+', RedisStateMachine::handleSingle),

        ERROR('-', RedisStateMachine::handleError),

        INTEGER(':', RedisStateMachine::handleInteger),

        // 下面開始都是 @since 6.0/RESP3
        FLOAT(',', RedisStateMachine::handleFloat),

        BOOLEAN('#', RedisStateMachine::handleBoolean),

        BULK_ERROR('!', RedisStateMachine::handleBulkError),

        VERBATIM('=', RedisStateMachine::handleBulkAndVerbatim), VERBATIM_STRING('=', RedisStateMachine::handleVerbatim),

        BIG_NUMBER('(', RedisStateMachine::handleBigNumber),

        MAP('%', RedisStateMachine::handleMap),

        SET('~', RedisStateMachine::handleSet),

        ATTRIBUTE('|', RedisStateMachine::handleAttribute),

        PUSH('>', RedisStateMachine::handlePushAndMulti),
       
        HELLO_V3('@', RedisStateMachine::handleHelloV3),

        NULL('_', RedisStateMachine::handleNull),

        BULK('$', RedisStateMachine::handleBulkAndVerbatim),

        MULTI('*', RedisStateMachine::handlePushAndMulti), BYTES('*', RedisStateMachine::handleBytes);

        final byte marker;

        private final StateHandler behavior;

        Type(char marker, StateHandler behavior) {
            this.marker = (byte) marker;
            this.behavior = behavior;
        }

        @Override
        public Result handle(RedisStateMachine rsm, State state, ByteBuf buffer, CommandOutput<?, ?, ?> output,
                Consumer<Exception> errorHandler) {
            return behavior.handle(rsm, state, buffer, output, errorHandler);
        }
    }

    enum Result {
        NORMAL_END, BREAK_LOOP, CONTINUE_LOOP
    }

    Type type = null;

    int count = NOT_FOUND;

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer();
        sb.append(getClass().getSimpleName());
        sb.append(" [type=").append(type);
        sb.append(", count=").append(count);
        sb.append(']');
        return sb.toString();
    }

}

繼續 debug,會來到 doDecode 方法。

這里有兩個核心步驟:

  1. 根據讀取到的第一個字節,判斷是不是 RESP3。
  2. 調用 狀態機 中的 State.Type 枚舉類,處理 handle。

圖片

這里先手動解析下服務器返回的數據。

ByteBufUtil.decodeString(buffer,0,146, Charset.defaultCharset());
%7
$6
server
$5
redis
$7
version
$6
6.0.12
$5
proto
:3
$2
id
:74
$4
mode
$10
standalone
$4
role
$6
master
$7
modules
*0

handleMap

%7 對應的 handler 處理。

圖片圖片

后面就進入 狀態機 流程判斷了,上面我們拿到的數據要循環好久,就不一一列舉出來了。

$6 對應的 handler 處理。

圖片圖片

最后解析出來剛好 7 個,可以對比上面手動解析的結果驗證下。

圖片圖片

小結

到了這里,decode 的流程也完畢了,畫個圖總結下??。

圖片圖片

結尾

Lettuce 的 decode 依賴于 狀態機 RedisStateMachine 實現,encode 靠 SingularArgument 實現。

圖片圖片

這次我做了兩種嘗試:

  1. 按以往的方式,從測試例子開始 debug。
  2. 思考下框架的特性,直奔主題。

兩種方式都收獲頗豐,但第二種嘗試得比較少,以后可以多多實踐,站在不同的角度去思考問題。

責任編輯:武曉燕 來源: Java4ye
相關推薦

2024-05-16 07:55:54

NettyRedisRESP協議

2019-08-09 10:15:07

程序員項目研發

2021-09-29 00:19:10

容器集群k8s

2021-01-22 09:11:34

Python多線程CPU

2025-07-21 08:22:30

localhost身份證號綽號

2021-08-02 15:06:46

vim服務Java

2025-03-12 10:36:32

2022-01-12 19:59:19

Netty 核心啟動

2021-06-02 16:19:14

技術研發指標

2020-10-26 16:35:53

內存JavaThreadLocal

2014-11-11 09:56:54

2013-09-02 09:44:54

2021-10-08 09:07:09

算法程序技術

2018-01-30 11:52:39

IDC全閃存

2020-10-09 14:46:57

阿里巴巴互聯網存儲

2017-06-12 17:47:19

2018-08-03 09:26:06

2020-08-10 10:59:00

黑客?推特漏洞

2015-10-13 10:49:44

Pear OSMac OS XLinux

2021-01-04 15:02:21

加密貨幣區塊鏈存儲
點贊
收藏

51CTO技術棧公眾號

久久99国产精品麻豆| 直接在线观看的三级网址| 亚洲精选一区| 亚洲最大中文字幕| 婷婷六月天在线| 日本天码aⅴ片在线电影网站| 成人精品在线视频观看| 日本中文字幕成人| 国产精品久久久精品四季影院| 欧美激情网址| 91精品国产欧美一区二区成人| 青春草国产视频| av在线之家电影网站| 久久精品在线观看| 亚洲最新av网址| 中文字幕99页| 欧美黑粗硬大| 一本色道亚洲精品aⅴ| 国产精品12p| 激情福利在线| 波多野结衣在线一区| 成人激情av在线| 超碰超碰超碰超碰| 欧美日韩天堂| 久久精品国产亚洲精品| 精品国产无码在线观看| 国产精品xxxav免费视频| 欧美日韩国产首页| 大香煮伊手机一区| 超碰成人av| 一区二区在线看| 一区二区三区四区视频在线| 欧美一区二区三区少妇| 国产高清在线精品| 国产色视频一区| 天堂av免费在线观看| 99综合视频| 久久久久久久久久久免费精品| 日韩三级在线观看视频| 成人婷婷网色偷偷亚洲男人的天堂| 亚洲国产美女精品久久久久∴| 无码人妻一区二区三区在线视频| 国精品产品一区| 欧美性生活久久| 天堂中文视频在线| 黄色片免费在线观看| aaaaa级少妇高潮大片免费看| 黄色片网站在线| 久久动漫网址| 在线亚洲精品福利网址导航| 欧美日韩一道本| hd国产人妖ts另类视频| 一区二区三区色| 成年在线观看视频| 中文av资源在线| 一区二区三区在线不卡| 97av中文字幕| 先锋影音在线资源站91| 亚洲精品乱码久久久久| 亚洲小视频在线播放| 青青草原av在线| 亚洲图片有声小说| 免费国产a级片| 麻豆mv在线看| 色狠狠一区二区| 欧美两根一起进3p做受视频| 国产精品亚洲d| 欧美日韩国产欧美日美国产精品| 一路向西2在线观看| 亚洲天堂网站| 精品日韩在线一区| 98精品在线视频| 国产一精品一aⅴ一免费| 亚洲国产视频二区| 亚洲成人黄色网址| 国产三级视频网站| 国产影视一区| 日韩一区二区三区xxxx| 永久免费看黄网站| 99精品国产在热久久下载| 51精品在线观看| 中文字幕无线码一区| 国产精品一区免费在线观看| 国产一区在线观| 大乳在线免费观看| 亚洲精选免费视频| 国产h视频在线播放| 日韩一区二区三区免费视频| 欧美一区二区在线视频| 国产高清成人久久| 欧美在线电影| 欧美国产日本高清在线| 黄瓜视频在线免费观看| 精品一区精品二区高清| 国产乱码精品一区二区三区日韩精品| 激情小视频在线观看| 国产精品剧情| 久久精品人人做人人综合| 亚洲一区二区三区欧美| 黄网在线免费看| 国产精品久久久久av蜜臀| 天天综合网天天综合色| 成人免费在线观看视频网站| 一区二区在线视频观看| 亚洲欧美日韩在线一区| 亚洲天堂网av在线| 国产精品一国产精品k频道56| 国产日韩欧美在线看| 日本黄色大片视频| 国产精品嫩草久久久久| 一二三四视频社区在线| 成人国产精品一区二区免费麻豆| 日韩精品自拍偷拍| 五月天婷婷丁香网| 亚洲美女毛片| 91午夜理伦私人影院| 国内在线精品| 亚洲国产精品麻豆| 中文字幕在线视频精品| 免费观看久久av| 欧美激情中文字幕乱码免费| 国产精品天天操| 国产欧美精品一区二区三区四区| 国产原创中文在线观看| 国产中文欧美日韩在线| 永久免费毛片在线播放不卡| 日韩欧美大片在线观看| 国产91对白在线观看九色| 亚洲精品日韩精品| 亚洲免费av一区| 日韩中文在线| 日韩在线免费观看视频| 中文字字幕在线中文| 亚洲综合久久网| 欧美—级高清免费播放| 一本一道无码中文字幕精品热| 国产精品综合二区| 亚洲欧美99| 国产另类xxxxhd高清| 日韩高清av一区二区三区| 国产亚洲第一页| 国产成人av在线影院| 麻豆中文字幕在线观看| 久久亚洲人体| 中文字幕少妇一区二区三区| 男人天堂视频网| 国产亚洲精品免费| 成人在线观看a| 欧美精品momsxxx| 日韩av电影院| 国产福利在线看| 91高清视频在线| 男人天堂资源网| 黄一区二区三区| 中文字幕色一区二区| 色8久久影院午夜场| 亚洲欧洲国产伦综合| 久久久久在线视频| 国产日产欧美一区| 中日韩av在线播放| 黄色成人在线网| 久久人人超碰| 热re99久久精品国产99热| 日韩影院在线| 国产一区二区欧美日韩| 亚洲天堂网在线视频| 国产精品成人在线观看| 欧美又黄又嫩大片a级| 欧美不卡视频| 国产一区二区在线网站| 中文在线免费视频| 一区二区三区久久精品| 91精品在线视频观看| 亚洲男同性恋视频| 国产精品入口麻豆| 久久xxxx| 中文字幕一区二区三区最新| 警花av一区二区三区| 国内免费精品永久在线视频| 日本视频在线观看一区二区三区| 在线精品视频一区二区三四| 在线日韩国产网站| 国产不卡视频在线观看| 国产男女无遮挡| 欧美韩日高清| 国产在线精品一区二区三区》| 深夜成人影院| 久久天堂av综合合色| 色一情一乱一乱一区91av| 色噜噜久久综合| 成熟的女同志hd| 久久久久九九视频| 欧美污在线观看| 91久久久久| 中文字幕99| 国产精品网址| 国产欧洲精品视频| 成入视频在线观看| 精品国偷自产在线视频99| 亚洲第一精品网站| 欧美视频在线一区| 国产无套粉嫩白浆内谢| 国产精品丝袜黑色高跟| 欧美日韩成人一区| 欧美三级日本三级| 国产视频一区二区在线观看| 日本特黄在线观看| 久久精品国语| 男人添女人荫蒂免费视频| 青青草国产成人a∨下载安卓| 国产精品露出视频| 电影中文字幕一区二区| 91丨porny丨九色| 亚洲香蕉网站| 亚洲欧美影院| 欧美巨大xxxx| 成人有码视频在线播放| 亚洲一二三四| 欧美肥臀大乳一区二区免费视频| av在线免费播放网站| 精品粉嫩超白一线天av| 在线观看视频中文字幕| 欧美日韩国产页| 青草草在线视频| 国产精品每日更新| 免费观看av网站| 成人小视频免费观看| 999这里有精品| 日韩精品欧美成人高清一区二区| 欧美午夜性视频| 亚洲蜜桃视频| 亚洲国产一区二区三区在线| 亚洲宅男一区| 精品乱码一区| 最新国产一区二区| 91手机在线视频| 国产一区精品二区| 91在线网站视频| 粉嫩av国产一区二区三区| 国产精品午夜一区二区欲梦| 日韩av中字| 日本久久久久亚洲中字幕| 婷婷五月精品中文字幕| 欧美日韩国产高清电影| 久草精品电影| 婷婷综合电影| 欧美精品二区三区四区免费看视频 | 久久在线中文字幕| 国产成+人+综合+亚洲欧洲| 色婷婷av一区二区三区之红樱桃 | 日韩精品不卡一区二区| 欧美污视频久久久| 欧美人妖在线| 蜜桃999成人看片在线观看| 精品女人视频| 精品一区二区三区自拍图片区| 国产毛片久久久| 狠狠色综合一区二区| 女同久久另类99精品国产| 国内精品一区二区| 伊人成综合网伊人222| 热re99久久精品国99热蜜月| 欧美日韩在线网站| 一本久道久久综合| 天天综合国产| 日韩美女爱爱视频| 亚洲永久免费| 日本爱爱免费视频| 狠狠久久亚洲欧美| 伊人久久久久久久久| 成人av网站大全| 性猛交ⅹxxx富婆video| 国产精品国产自产拍在线| www.色小姐com| 精品日韩中文字幕| 制服丝袜综合网| 美女福利一区二区| 国产欧美在线观看| 色悠久久久久综合先锋影音下载| 国产精品传媒毛片三区| 色橹橹欧美在线观看视频高清| 日韩欧美一区二区三区四区五区| 国产精品videosex性欧美| 丁香六月激情婷婷| 久久在线精品| 中文字幕55页| 91美女视频网站| 尤物在线免费视频| 午夜电影网一区| 在线观看免费视频a| 精品免费99久久| 成年人在线视频免费观看| 九九精品在线播放| 欧美日韩国产v| 99国产视频| 精品一区二区三区的国产在线观看| 日韩视频一二三| 久久看片网站| 亚洲成年人av| 国产日韩欧美在线一区| 久久久久久久黄色| 欧美艳星brazzers| 国产成人三级在线观看视频| 在线色欧美三级视频| 国产美女一区视频| 国产欧美日韩免费| 欧美日韩大片免费观看| 一本一道久久a久久精品综合| 亚洲精品色图| 男插女视频网站| 国产清纯白嫩初高生在线观看91| 国产亚洲精品久久久久久无几年桃 | 凹凸精品一区二区三区| 日韩亚洲欧美一区| 国产福利小视频在线| 国内精品小视频| 欧美电影在线观看一区| 亚洲国产婷婷香蕉久久久久久99| 99在线精品免费视频九九视| 免费不卡av网站| 国产精品欧美一区二区三区| 天堂网av手机版| 欧美一区二区三区婷婷月色| 成人影视在线播放| 欧美中文字幕在线视频| 国产精品毛片av| 99久热在线精品视频| 麻豆精品视频在线| 国产一区二区三区四区五区六区| 亚洲国产sm捆绑调教视频 | 在线看视频不卡| 日韩成人午夜电影| 国产精品无码一区二区三区免费| 一区二区欧美国产| 国产日韩欧美中文字幕| 日韩在线免费av| 人人精品久久| 午夜啪啪免费视频| 另类综合日韩欧美亚洲| 国产又粗又黄又猛| 欧美亚洲高清一区| 成年人在线视频免费观看| 国产成人精品视| 欧美日韩激情| 超碰超碰在线观看| 国产精品嫩草久久久久| 国产综合福利在线| gogo人体一区| 国产一线二线三线女| 国产成a人亚洲精| 国产成年人免费视频| 亚洲第一精品福利| 日韩国产欧美一区| 精品69视频一区二区三区Q| 天堂在线精品视频| 夜夜爽夜夜爽精品视频| 国产99久久九九精品无码免费| 久久综合伊人77777蜜臀| 国产高清精品二区| 国产精品啪啪啪视频| 国产成+人+日韩+欧美+亚洲| 国产在线拍揄自揄拍| 亚洲精品xxxx| 欧美××××黑人××性爽| 欧美在线视频二区| 美女视频网站黄色亚洲| 亚洲一二三在线观看| 欧美成人乱码一区二区三区| 国产手机视频在线| 欧美色综合天天久久综合精品| 成人性生交大片免费看午夜 | 日韩大尺度黄色| 日韩欧美在线观看强乱免费| 久久精品二区| 亚洲国产日韩在线| 影音先锋人妻啪啪av资源网站| 日韩欧美国产一区二区| 成人动漫在线免费观看| 成人h片在线播放免费网站| 欧美91视频| 久久亚洲AV成人无码国产野外 | 中文字幕一区二区在线视频| 精品国产网站地址| 亚洲天堂av资源在线观看| 精品少妇一区二区三区在线| 国产欧美日本一区视频| 99热这里只有精| 4438全国成人免费| 手机亚洲手机国产手机日韩| 岛国精品一区二区三区| 一本到三区不卡视频| 麻豆传媒在线免费| 黑人另类av| 麻豆91精品视频| 国产精品免费av一区二区| 日日骚久久av| 青青草这里只有精品| 中文字幕视频三区| 天天综合网 天天综合色| 性生交大片免费全黄|