日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-05-20 17:55:35 213觀看
導讀今天來分享 Lettuce —— 基于 Netty 實現,Springboot2 中默認的 redis 客戶端。那它是不是直接用 Netty 中的那幾個 handler 來處理 RESP 協議的呢?一起看看吧。可以看到這里并沒有 codec-redis 模塊,所以 Lettuce 并沒

今天來分享 Lettuce —— 基于 Netty 實現,Springboot2 中默認的 redis 客戶端。trb28資訊網——每日最新資訊28at.com

那它是不是直接用 Netty 中的那幾個 handler 來處理 RESP 協議的呢?一起看看吧。trb28資訊網——每日最新資訊28at.com

可以看到這里并沒有 codec-redis 模塊,所以 Lettuce 并沒有使用 Netty 提供的 redis 模塊。trb28資訊網——每日最新資訊28at.com

圖片圖片trb28資訊網——每日最新資訊28at.com

(⊙﹏⊙),問題解決得太快了,那就再來思考下,它是怎么做的呢?trb28資訊網——每日最新資訊28at.com

既然 Lettuce 基于 Netty 實現,那么它必然在 ChannelHandler 上動手腳,直接搜索可以發現有 9 個實現類。trb28資訊網——每日最新資訊28at.com

圖片圖片trb28資訊網——每日最新資訊28at.com

這里我關心的就是它怎么編解碼,所以直接來看 CommandEncoder 和 CommandHandler 。trb28資訊網——每日最新資訊28at.com

打上斷點,使用測試例子直接 debug。trb28資訊網——每日最新資訊28at.com

代碼

@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 流程。trb28資訊網——每日最新資訊28at.com

CommandHandler

圖片圖片trb28資訊網——每日最新資訊28at.com

如圖,直接來到 nioEventLoop 線程,并調用了 write 方法。trb28資訊網——每日最新資訊28at.com

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

從右邊可以看到,發了一個 HELLO 的命令出去,其中 CommandArgs 如下:trb28資訊網——每日最新資訊28at.com

CommandArgs [buffer=$13$4AUTH$7default$6123456]

CommandArgs?

直接來到 toString 方法,可以發現 encode 方法。trb28資訊網——每日最新資訊28at.com

圖片圖片trb28資訊網——每日最新資訊28at.com

如圖,有 4 個 SingularArgument:trb28資訊網——每日最新資訊28at.com

圖片圖片trb28資訊網——每日最新資訊28at.com

看看他們是怎么 encode 的 。trb28資訊網——每日最新資訊28at.com

ProtocolKeywordArgument

圖片圖片trb28資訊網——每日最新資訊28at.com

StringArgument

圖片圖片trb28資訊網——每日最新資訊28at.com

對比 Netty

圖片圖片trb28資訊網——每日最新資訊28at.com

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

還有一個 大小端序 的處理,只能說 Netty 太細了。trb28資訊網——每日最新資訊28at.com

圖片圖片trb28資訊網——每日最新資訊28at.com

CommandEncoder

直接 F9 來到這一個斷點。trb28資訊網——每日最新資訊28at.com

圖片圖片trb28資訊網——每日最新資訊28at.com

繼續 debug ,會來到 Command 類,在這里完成對發送數據的 encode。trb28資訊網——每日最新資訊28at.com

圖片圖片trb28資訊網——每日最新資訊28at.com

解析下要發送的數據。trb28資訊網——每日最新資訊28at.com

圖片圖片trb28資訊網——每日最新資訊28at.com

小結

那么到了這里,我們就了解完 encode 的實現了。trb28資訊網——每日最新資訊28at.com

核心:CommandArgs 中的各種 SingularArgumenttrb28資訊網——每日最新資訊28at.com

圖片圖片trb28資訊網——每日最新資訊28at.com

下面就是接受服務器數據,進行 decode 的流程了。trb28資訊網——每日最新資訊28at.com

CommandHandler

來到 channelRead 。trb28資訊網——每日最新資訊28at.com

圖片圖片trb28資訊網——每日最新資訊28at.com

decode 時,會調用到 RedisStateMachine 的 decode ,它是這個流程的核心。trb28資訊網——每日最新資訊28at.com

圖片圖片trb28資訊網——每日最新資訊28at.com

RedisStateMachine?

Redis 狀態機:trb28資訊網——每日最新資訊28at.com

圖片圖片trb28資訊網——每日最新資訊28at.com

這里我直接 copy 了一份 。trb28資訊網——每日最新資訊28at.com

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 方法。trb28資訊網——每日最新資訊28at.com

這里有兩個核心步驟:trb28資訊網——每日最新資訊28at.com

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

圖片trb28資訊網——每日最新資訊28at.com

這里先手動解析下服務器返回的數據。trb28資訊網——每日最新資訊28at.com

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

handleMap

%7 對應的 handler 處理。trb28資訊網——每日最新資訊28at.com

圖片圖片trb28資訊網——每日最新資訊28at.com

后面就進入 狀態機 流程判斷了,上面我們拿到的數據要循環好久,就不一一列舉出來了。trb28資訊網——每日最新資訊28at.com

$6 對應的 handler 處理。trb28資訊網——每日最新資訊28at.com

圖片圖片trb28資訊網——每日最新資訊28at.com

最后解析出來剛好 7 個,可以對比上面手動解析的結果驗證下。trb28資訊網——每日最新資訊28at.com

圖片圖片trb28資訊網——每日最新資訊28at.com

小結

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

本文鏈接:http://m.www897cc.com/showinfo-26-89411-0.html基于 Netty 的 Lettuce 居然是這樣解析RESP協議的

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Java引用類型解析:掌握強引用、軟引用、弱引用和幻象引用的妙用

下一篇: 我發現了大廠OpenApi接口的bug!你發現了嗎?

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美jjzz| 久久嫩草精品久久久久| 亚洲精品你懂的| av成人免费| 亚洲欧美在线免费| 久久天天狠狠| 欧美视频不卡中文| 国产日韩免费| 亚洲精品国产精品国自产在线| 日韩视频一区二区三区在线播放免费观看 | 欧美激情久久久久| 国产精品久久午夜| 黄色小说综合网站| 一区二区三区 在线观看视| 性做久久久久久| 久久在线视频在线| 欧美日韩一区二区视频在线| 国产欧美日韩亚州综合| 亚洲国产精品久久久久秋霞影院| 亚洲视频观看| 久热这里只精品99re8久| 国产精品成人在线观看| 樱花yy私人影院亚洲| 一区二区三区蜜桃网| 久久久7777| 欧美色123| 亚洲二区精品| 亚洲男同1069视频| 欧美电影免费观看大全| 国产欧美一区二区精品忘忧草 | 国产欧美综合在线| 亚洲人成人77777线观看| 午夜视频在线观看一区二区| 欧美黑人在线观看| 国产亚洲欧美激情| 一区二区欧美视频| 麻豆久久精品| 国产午夜精品一区理论片飘花 | 在线一区亚洲| 麻豆精品精华液| 国产老肥熟一区二区三区| 亚洲精品久久嫩草网站秘色| 欧美伊人久久久久久久久影院| 欧美女激情福利| 激情久久五月天| 亚洲一区在线免费| 欧美巨乳波霸| 好吊日精品视频| 亚洲影院一区| 欧美日韩高清免费| 亚洲激情视频在线播放| 久久福利影视| 国产精品久久久久久亚洲毛片| 亚洲精品国产精品国自产在线 | 欧美高潮视频| 国产一区二区三区直播精品电影| 欧美精品亚洲精品| 国产亚洲一区二区在线观看 | 欧美午夜精彩| 9l国产精品久久久久麻豆| 蜜桃av一区二区在线观看| 国产精品美腿一区在线看 | 午夜视频在线观看一区| 欧美日韩国产三级| 亚洲人www| 鲁鲁狠狠狠7777一区二区| 国户精品久久久久久久久久久不卡| 亚洲欧美中文在线视频| 国产精品老牛| 亚洲性感美女99在线| 欧美日韩一区二区欧美激情| 日韩一级欧洲| 欧美日韩另类视频| 99国产精品久久| 欧美理论视频| 亚洲欧洲日本一区二区三区| 老司机一区二区三区| 一区免费在线| 老司机亚洲精品| 亚洲国产精品久久人人爱蜜臀 | 国产精品一区久久| 午夜欧美理论片| 国产日本欧美一区二区| 香蕉免费一区二区三区在线观看| 国产精品一区免费视频| 性xx色xx综合久久久xx| 国产精品亚洲欧美| 午夜在线成人av| 国产一区二区三区直播精品电影| 久久国产精品网站| 一色屋精品视频在线看| 欧美多人爱爱视频网站| 99精品久久| 国产精品久久久久久影院8一贰佰 国产精品久久久久久影视 | 久久这里只有| 精品99一区二区三区| 欧美h视频在线| 亚洲精品色图| 欧美色欧美亚洲另类二区| 99国产精品99久久久久久| 欧美系列电影免费观看| 性做久久久久久免费观看欧美| 国产一区自拍视频| 久久综合色婷婷| 亚洲三级性片| 国产精品久久久久久久电影| 午夜亚洲激情| 影音先锋成人资源站| 欧美成人蜜桃| 亚洲天堂av图片| 国产亚洲精品自拍| 欧美黄污视频| 亚洲一区二区三区视频| 国产亚洲精品久久久久久| 久久在线免费视频| 一本大道久久a久久综合婷婷| 国产精品亚洲美女av网站| 久久久天天操| 亚洲精品美女在线观看| 国产精品美女主播| 久久久久国产精品www| 亚洲精品欧美精品| 国产精品一区二区三区观看| 久久精品主播| 99re8这里有精品热视频免费| 国产精品久久激情| 久久久欧美精品sm网站| aaa亚洲精品一二三区| 欧美成黄导航| 亚洲欧美春色| 亚洲国产一区二区三区a毛片| 欧美午夜免费| 久久精品视频导航| 一本一本久久| 狠狠色狠狠色综合日日五| 欧美人妖另类| 久久久久久高潮国产精品视| 99精品欧美一区二区三区综合在线 | 久久久精品动漫| 一本色道久久加勒比88综合| 国产视频自拍一区| 欧美日韩成人在线观看| 国产日韩欧美在线视频观看| 久久综合五月天婷婷伊人| 中文av一区二区| 在线精品亚洲一区二区| 国产精品伦理| 欧美激情一区二区| 久久精品一区二区国产| 一区二区三区高清在线| 在线播放日韩专区| 国产精品免费视频观看| 欧美高清成人| 久久亚洲春色中文字幕| 亚洲综合欧美日韩| 亚洲日本中文字幕| 国产欧美三级| 欧美性片在线观看| 欧美国产91| 久久久久五月天| 欧美亚洲免费| 一区二区三区视频观看| 亚洲国产成人久久| 国产一区二区三区奇米久涩| 欧美无砖砖区免费| 欧美国产日产韩国视频| 久久久噜噜噜久久中文字幕色伊伊| 一个色综合av| 在线日本成人| 国产自产在线视频一区| 国产精品色婷婷久久58| 欧美精品久久久久久久久久| 久久久五月婷婷| 香蕉亚洲视频| 亚洲综合第一| 一本色道久久综合亚洲精品按摩 | 欧美日韩黄色一区二区| 久久网站热最新地址| 午夜在线精品| 亚洲伊人伊色伊影伊综合网| 亚洲日本理论电影| 在线观看国产精品淫| 国产一区二区三区久久久| 国产精品普通话对白| 欧美激情中文字幕一区二区| 久久夜色精品国产噜噜av| 久久精品一区二区三区四区| 欧美亚洲视频在线看网址| 亚洲视频综合| 亚洲视频欧洲视频| 一区二区三区久久| 亚洲精品在线观看免费| 亚洲激情另类| 91久久精品国产91性色tv| 在线精品观看| 亚洲第一黄网| 亚洲成人在线免费| 黄色成人精品网站| 一区视频在线| 亚洲国产经典视频| 亚洲国产精品女人久久久| 1769国产精品| 亚洲欧洲精品一区二区三区不卡 | 国产欧美日韩激情|