# Redis Java Client 當一個專案發展到中後期,資料量越來越大導致資料庫存取效能下降時,通常都會選擇使用快取以減輕資料庫的負擔,而Redis 就是最熱門的選項。 Redis (Remote Dictionary Server),它是由`ANSI C`編寫而成的開源軟體(BSD 協議),與一般資料庫不同,它是將資料以key-value 的形式儲存在記憶體當中,常用於資料庫、**快取**、訊息佇列、串流引擎等功能。 而我們應用程式要使用Redis 強大的功能,則需要透過Redis Client 來負責與Redis 交互,在Java 中常用的Redis Client 有以下三種: 1. Jedis 2. Lettuce 3. Redisson --- ## 基本介紹 ### Jedis Jedis 是最基本的Redis 客戶端,提供的API比較**直覺**和**簡單**,整個依賴也比較輕量,在Spring Boot 1.x 都是默認使用Jedis。 它的缺點也很明顯,Jedis 的IO 模型採用**BIO**,在高併發的情境下處理效率與另外兩者相比遜色不少,而且它並**不是線程安全**的,需要透過連線池來操作。 ### Lettuce 在[官方的介紹](https://github.com/lettuce-io/lettuce-core)中,Lettuce 是**可擴展且線性安全**的Redis Clien,適用於同步、非同步和響應式的應用場景,底層是基於Netty 並且支援叢集、哨兵等模式,在Spring Boot 2.x 之後便默認使用Lettuce。 ### Redisson Redisson 與Lettuce 類似,是**線性安全且支援異步**,底層也同樣基於Netty 框架,並且支援叢集、哨兵等模式。 它額外提供了記憶體資料網格(In-Memory Data Grid)的功能,**支援Redis 各種的分散式物件和服務**,如分散式鎖、分散式集合等,但它**對字串符的操作支援較差**。 --- ## 結論 在性能表現上,**Jedis 都是遜於Lettuce 和Redisson**,但Lettuce 和Redisson 哪個表現更好並沒有一個定論,畢竟雖然都是基於Netty 且支援非同步,但它們各自關注的問題並不一樣,應該還是依照使用情境區分。 不過,在撰寫本篇文章的當下,還沒有完整使用過上述三個Redis 客戶端的功能,但以目前搜集的資訊來看,還是可以稍微區分一下它們的應用場景: - Jedis:簡單、輕量級、非高併發場景,基本上就是開發初期,可以先快速建立一個POC 展示功能。 - Lettuce:高併發場景,利用Lettuce 非同步的特性,可以很好的管理和處理大量併發的Redis 請求,並且提供優異的效能。 - Redisson:分散式系統,Redisson 是專注於處理分散式事務的Library,提供很多分散式相關的操作服務。 事情還沒有結束,那如果是高併發+分散式系統呢? 根據網路上的說法,推薦使用Lettuce+Redisson,按照業務內容區分Lettuce 處理高併發請求、Redisson 處理分散式事務,但記得要綜合考量系統需求、資源管理、性能優化等方面,確保能夠合理的處理高併發請求並實現分布式資料管理。 --- ## 參考資料 [Jedis Github](https://github.com/redis/jedis) [Lettuce Github](https://github.com/lettuce-io/lettuce-core) [Redisson Github](https://github.com/redisson/redisson) [分布式场景Redis客户端最优解决方案-lettuce + Redisson](https://www.jianshu.com/p/786debcbbe8d)