Lettuce 架構解剖&源碼精讀

背景

從 SpringBoot 2.X 版本開始,Lettuce 作為 Redis Java 客戶端程序集成到 Spring Data,在 Jedis 橫行的年代,Lettuce 能夠進入 Spring Boot 的陣營,這引起了庖丁的好奇,在對 Lettuce 認真瞭解後,發現這個 Redis 的 Java 客戶端確實非常優秀,非常值得解刨,於是有了本系列文章。

本文主要對 Lettuce 的主要功能和優秀支持進行介紹,讀完本文你可以瞭解 Lettuce 的核心功能,喚醒你對 Lettuce 架構設計以及源碼的極度好奇。


Lettuce 簡介

想要解刨一個框架,最好的辦法是先去官網的首頁看看,可以快速瞭解這個框架的核心目標,主要功能和設計思想或者哲學,lettuce 也不例外,下圖是 Lettuce 官網的截圖。


Lettuce 架構解剖&源碼精讀

來源於 Lettuce 官網:構建彈性數據訪問

大家看看 Lettuce 這個組件的遠景,構建彈性的數據訪問,非常契合當前業界彈性計算的價值觀。那麼 Lettuce 到底是什麼呢?我們需要給它一個準確的定義,正如上圖官網所言,Lettuce是一個開源的、可擴展的Redis客戶端,用於構建無阻塞的Reactive應用程序。它的官方網站地址:https://lettuce.io/ ,源碼託管地址:
https://github.com/lettuce-io/lettuce-core。

Lettuce是可伸縮的線程安全Java Redis客戶端,為Redis Standalone,PubSub,Redis Sentinel和Redis Cluster提供同步,異步和反應性API。如果多個線程避免阻塞和事務性操作(例如BLPOP和MULTI / EXEC),則可以共享一個連接。出色的netty NIO框架可有效管理多個開放連接。每個redis命令由一個或多個名稱與小寫redis命令名稱相同的方法實現。具有多個可修改結果類型的修飾符的複雜命令包括CamelCased修飾符作為命令名稱的一部分,例如zrangebyscore和zrangebyscoreWithScores。

Redis連接被設計為長期存在,如果連接丟失,將重新連接,直到調用close()為止。成功重新連接後,將(重新)發送尚未超時的未決命令。

所有連接都從其RedisClient繼承默認超時,並且當非阻塞命令在超時到期之前未能返回結果時,將引發RedisException。超時默認為60秒,可以通過
AbstractRedisClient.setDefaultTimeout(java.time.Duration)或針對每個單獨的連接進行更改。

上面這些功能看起來非常強大,已經滿足了Java 程序操作 Redis 的要求。這麼優秀的程序是如何設計出來的?它的核心架構是什麼樣的呢?核心的功能是怎麼實現的呢?庖丁會通過一系列文章來為你解惑。

為什麼解剖Lettuce 架構?

從上面的文字描述中,我們瞭解到 Lettuce 是一個優秀的Java Redis 客戶端,那麼它有哪些亮點或者功能能夠從眾多的 Java Redis 客戶端中脫穎而出呢?繼續看看 Lettuce 官網的闡述,如下圖。

Lettuce 架構解剖&源碼精讀

來源於 Lettuce 官網:Lettuce 的主要特性

Lettuce is a fully non-blocking Redis client built with netty providing Reactive, Asynchronous and Synchronous Data Access .

注意提取關鍵詞,完全非阻塞,基於 Netty,響應式的,同步和異步數據訪問。

Lettuce provides asynchronous API with RedisFuture (CompletionStage) and Reactive types [Flux N] and [Mono 0|1].

完全利用了 Java 8 的語言特性,Future,Flux ,Mono 這些詞彙背後的語義到底是什麼呢?

NON BLOCKING I/O: Low-latency communication, backpressure-enabled network engine for NIO TCP, epoll TCP and Unix Domain Sockets. Reactive Streaming is fully supported.

非租塞式 I/O ,低延遲通訊,背壓處理?

上面這些問題,你都能回答出來了嗎?如果都可以,那麼你可以忽略本文了,如果還有些模糊,那就和庖丁一起,一切解剖 Lettuce 的架構。

日常的工作中,我們對於框架的理解主要停留在使用階段,知其然很少或者很難知其所以然,一方面是因為工作繁忙,另一個主要原因是相關的文檔或者資料都比較淺顯,很少深入去剖析架構原理,闡述設計思想和哲學,方便大家理解和學習,能夠學以致用,舉一反三,觸類旁通,這也是庖丁解剖 Lettuce 架構的主要原因。

為什麼要精讀 Lettuce 源碼?

架構是設計思想的一種自然語言的描述,可以通過文字,圖表,配合 UML 等設計圖去闡述系統結構和主要組成部分,但是如何通過編程語言來實現架構標識的功能,滿足業務或者使用方的訴求呢?答案就藏在源碼中,通過學習優秀的源碼,深入理解語言特性,設計模式以及編程技巧,提升我們的審美能力,只有見過和欣賞過優秀的源碼,才有可能寫出優秀的代碼,這個寫作需要大量閱讀培養語感,學習書畫需要大量的臨摹是異曲同工的。

Lettuce 幾乎用盡了Java 語言的所有特性,同步,異步,響應式,線程安全,Reactor等都是 Java 語言非常主要的特性,也是日常編碼解決問題的主要工具,更是各大廠面試必考的考點。所以庖丁會去精讀 Lettuce 的源碼,請大家關注後續系列文章,一窺 Lettuce 的廬山真面目。

後續系列文章鏈接

後續系列地址文章鏈接會同步更新到這裡,方便檢索,最後會彙總起來,形成完整的文章。

參考資料

  • Lettuce 官網: https://lettuce.io/
  • Lettuce 源代碼: https://github.com/lettuce-io/lettuce-core
  • 文檔:https://lettuce.io/core/release/reference/index.html#getting-started.start-coding
  • API 文檔: https://lettuce.io/core/release/api/


分享到:


相關文章: