[翻譯]Jedis與Redisson選型對比

概述

Jedis和Redisson都是Java中非常成熟的Redis類庫(7000+stars),選型主要考慮以下幾個方面,引入新依賴數量、編程模式、可擴展性、代碼實現、項目規劃。
翻譯自Stack Overflow上的回答:https://stackoverflow.com/a/42255613 ,原文更新時間2017年10月6日,沒有信達雅的地方歡迎多多指教0.0

第三方依賴數量

Jedis基本上沒有什麼依賴dependency-free,僅僅依賴了Apache Commons Pool 2用作連接池。
在這裏插入圖片描述
Redisson需要Netty,JCache API以及Project Reactor幾個大的第三方庫作爲基本的依賴,這是也是他方便擴展的一個原因
在這裏插入圖片描述

編程模式

這指的是你怎麼調用Redis的客戶端,並且決定你功能的抽象層次。
Jedis是一個低層次的類庫,直接將Redis API暴露爲Java的方法調用,基本是一個方法對應一個Redis的API:

Jedis jedis = …;

jedis.set("key", "value");

List<String> values = jedis.mget("key", "key2", "key3");

Redisson是一個高層次封裝的客戶端,暴露給用戶的是方便且齊全的新方法,還提供Redis本身沒有的數據結構;每個方法底層會可能會有一個或多個Redis的調用,並且還會有Lua腳本的調用

Redisson redisson = …

RMap map = redisson.getMap("my-map"); // implement java.util.Map

map.put("key", "value");

map.containsKey("key");

map.get("key");

可擴展性

我們來看看他們底層的編程模式。
Jedis使用了阻塞IO和同步方法調用。你的程序編碼邏輯需要一直等待,直到網絡IO的完成。不支持異步(Future, CompletableFuture)和響應式編程(RxJava Observable or Reactive Streams Publisher)。Jedis如果不用線程池,每個client實例還是非線程安全的。
反觀Redisson使用非阻塞IO、Netty事件驅動的通信。方法調用支持同步、異步也可以是響應式的( Project Reactor )。連接是使用連接池,並且API本事線程安全且耗費資源更少。

代碼實現

兩個類庫功能都非常豐富,都可以滿足我們的功能需求。
Jedis是一個很直接簡單的實現,直接通過將命令寫入OutputStream並解析響應,沒有更高級操作。如果你需要更高級的功能,只能自己用Redis API去實現。Jedis讓你可以完全控制你所調用的命令和相應的返回值,相應地你需要花額外的精力去實現的功能。
Redisson作爲一個高層級的客戶端,通過新的抽象去提供功能調用。你無需知道Redis具體如何操作,就可以使用這些功能和結構(Map, List, Set, …),Redisson會自動轉換成相應的Redis調用。你可能並不喜歡他的一些功能和具體實現,但是你很難做相應的修改(除非你熟悉整個框架,並對源碼進行修改)。但是直接使用他的高級功能,可以避免你很多額外的開發。

項目規劃

完全取決於你項目技術發展方向。
Jedis簡單,但是沒有異步,跟雲平臺(如AWS ElastiCache)結合可能需要定製開發。
Redisson功能齊全,包含Jedis的所有功能,對雲平臺的支持支持。

總結

功能需求不多,上Jedis即可
功能需求複雜使用Redisson,雖然臃腫但是功能齊全

參考

Jedis與Redisson選型對比 //這篇譯文沒有好像沒有指明出處。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章