技術選型關於redis客戶端選擇


redis作為分布式緩存框架的首選  相信已經毋庸置疑。能高效、合理的使用好它  必定能提升系統的可用性,高性能、高吞吐量的保障。但選擇一個客戶端,充分發揮它的能力,就是一個選型問題。現在市場上能選擇的產品也較多。但選擇較多的是redission、Lettuce、jedis 跟着下面這篇文章 好好了解下 各自的優缺點,詳細能對你有一定幫助。比如分布式鎖選型...redission在分布式鎖續期問題的解決思路...
 
1.背景     研發部門對於客戶端選型比較廣泛和隨意,依賴的分支也不統一,感覺就像百度到一個就直接用,或者是有一個功能滿足就換,沒有考慮到其他組的使用情況以及集中維護。 &nbs...

1.背景

    研發部門對於客戶端選型比較廣泛和隨意,依賴的分支也不統一,感覺就像百度到一個就直接用,或者是有一個功能滿足就換,沒有考慮到其他組的使用情況以及集中維護。

    另外一個是如果作為公司pom腳手架的基本組成部分,需要考慮統一成一個還是多個並存的問題,現在有兩個考量:如果性能不是大問題,建議統一集中為一個就行; 如果需要多個並存,至少不能多於2個客戶端。

2.比較

    官方推薦的java客戶端只有Jedis、lettuce、Redisson,所以這次分析只針對這三個進行。

2.1.概述

    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/

2.2.性能

    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的大小范圍),很難去做定量和可對比的基准測試(主要是我懶)。

2.3.功能

    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.延遲隊列

2.4.選型

    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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM