1.背景
研發部門對於客戶端選型比較廣泛和隨意,依賴的分支也不統一,感覺就像百度到一個就直接用,或者是有一個功能滿足就換,沒有考慮到其他組的使用情況以及集中維護。
另外一個是如果作為公司pom腳手架的基本組成部分,需要考慮統一成一個還是多個並存的問題,現在有兩個考量:如果性能不是大問題,建議統一集中為一個就行; 如果需要多個並存,至少不能多於2個客戶端。
官方推薦的java客戶端只有Jedis、lettuce、Redisson,所以這次分析只針對這三個進行。
Jedis: redis的Java實現客戶端,提供了比較全面的Redis命令的支持。
lettuce: Lettuce is a scalable thread-safe Redis client for synchronous, asynchronous and reactive usage. Multiple threads may share one connection if they avoid blocking and transactional operations such as BLPOP and MULTI/EXEC. Lettuce is built with netty. Supports advanced Redis features such as Sentinel, Cluster, Pipelining, Auto-Reconnect and Redis data models.
Redisson: Redisson是一個在Redis的基礎上實現的Java駐內存數據網格(In-Memory Data Grid)。它不僅提供了一系列的分布式的Java常用對象,還提供了許多分布式服務。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service) Redisson提供了使用Redis的最簡單和最便捷的方法。Redisson的宗旨是促進使用者對Redis的關注分離(Separation of Concern),從而讓使用者能夠將精力更集中地放在處理業務邏輯上。
lettuce: 直接看官網的:https://lettuce.io/
Jedis的性能比lettuce和Redisson都要差一點,三者的主要差異在於以下:
1.Jedis使用同步和阻塞IO的方式,不支持異步;lettuce和Redisson支持異步,底層是基於netty框架的事件驅動作為通信層。
2.Jedis設計上就是基於線程不安全來設計,一個連接只能被一個線程使用,但是可以結合連接池來提高其性能;lettuce和Redis基於線程安全來設計的,一個連接是被共享使用的,但是也提供了連接池,主要用於事務以及阻塞操作的命令。
3.lettuce和Redisson支持異步流的方式。
一些公開的benchmark結果:
Redisson和Jedis:
https://dzone.com/articles/redisson-pro-vs-jedis-which-is-faster
Jedis和lettuce:
https://www.dubby.cn/detail.html?id=9108
上面的測試結果都是比較久遠的,沒找到三者共同參與的性能測試結果。
沒有做三者的性能基准測試,主要是無目的性、無針對性的條件限制(並發數、數據量、指令kv的大小范圍),很難去做定量和可對比的基准測試(主要是我懶)。
Jedis: 提供比較全面的redis原生指令的支持,上層封裝比較弱,集群特性支持度非常低,高級特性幾乎沒有。
lettuce: 高級redis客戶端,支持各種模式的redis連接和操作,高級特性幾乎沒有。
Redisson: 高級redis客戶端,支持各種模式的redis連接和操作,同時提供一大堆的實用功能。
Jedis和lettuce沒什么功能,就簡單的操作,連分布式鎖都需要自己實現,所以先聊聊Redisson的高級功能,中間偶爾會用Jedis和lettuce做對比。
1.十幾種編碼方式。
Redisson是基於對象的操作,對於key對象和value對象可用不同的高級編碼方式:
JsonJacksonCodec、AvroJacksonCodec、SmileJacksonCodec、CborJacksonCodec、MsgPackJacksonCodec、IonJacksonCodec、KryoCodec、SerializationCodec、FstCodec、LZ4Codec、SnappyCodec、CompositeCodec
和四種基本的編碼方式:
JsonJacksonMapCodec、StringCodec、LongCodec、ByteArrayCodec
而Jedis操作只針對字節數組, lettuce支持ByteArrayCodec、StringCodec、CipherCodec、CompressionCodec四種。
按需使用,沒有編碼方式的比對。
2.分布式集合。
把大集合拆分並均勻分布到各個節點上,集合包括Set、Map、BitSet、Bloom Filter、Spring Cache和Hibernate Cache,並且支持本地緩存。(只有專業版才能用)分布式鎖。
各種各樣的分布式鎖: 可重入鎖ReentrantLock、公平鎖FairLock、聯鎖MultiLock、紅鎖RedLock、讀寫鎖ReadWriteLock、信號量Semaphore、可過期的信號量PermitExpirableSemaphore、計數器CountDownLatch
3.RPC
4.分布式調度任務服務
5.分布式MR
6.復雜多維對象結構和對象引用的支持
7.集群pipeline
lettuce也支持。
jedis不支持,jedis連多key(分布在不同節點的)操作都不支持。
8.事務
提供了XA Transactions標准的實現,可以集成到Spring中。(只有專業版才能用)
9.集群管理工具
(只有專業版才能用)
10.限流器
分布式的限流工具(有timeout功能)。
11.自增/分布式ID
12.BloomFilter
13.延遲隊列
Spring最早是默認以Jedis作為客戶端, 但是后來改為了lettuce, lettuce與Jedis相比比較明顯的特點是異步和線程安全, 底層是netty大殺器作為通信層, 性能比Jedis的線程不安全+連接池要好。
Redisson是以其強大的功能以及面向對象的設計優於其他兩者。
根據我們的業務需要:
1.限流
2.分布式鎖
3.緩存
4.GID生成
5.延時隊列
6.lua腳本
7.請求合並
Redisson都能滿足,實際上單是使用Redisson作為Spring的客戶端就足夠了。
個人傾向lettuce + Redisson。
摘自https://www.hellojava.com/a/91920.html