Redis的Java客戶端很多,官方推薦的有三種:Jedis、Redisson和lettuce。
1、概況
- Jedis是Redis的Java實現的客戶端,其API提供了比較全面的Redis命令的支持;
- Jedis中的方法調用是比較底層的暴露的Redis的API,也即Jedis中的Java方法基本和Redis的API保持着一致,了解Redis的API,也就能熟練的使用Jedis。
- Redisson實現了分布式和可擴展的Java數據結構,提供很多分布式相關操作服務,例如,分布式鎖,分布式集合,可通過Redis支持延遲隊列。和Jedis相比,功能較為簡單,不支持字符串操作,不支持排序、事務、管道、分區等Redis特性。Redisson的宗旨是促進使用者對Redis的關注分離,從而讓使用者能夠將精力更集中地放在處理業務邏輯上。
- Redisson中的方法則是進行比較高的抽象,每個方法調用可能進行了一個或多個Redis方法調用。
- Lettuce:高級Redis客戶端,用於線程安全同步,異步和響應使用,支持集群,Sentinel,管道和編碼器。目前springboot默認使用的客戶端。
2、伸縮性
- Jedis:使用阻塞的I/O,且其方法調用都是同步的,程序流需要等到sockets處理完I/O才能執行,不支持異步。Jedis客戶端實例不是線程安全的,所以需要通過連接池來使用Jedis。
- Jedis僅支持基本的數據類型如:String、Hash、List、Set、Sorted Set。
- Redisson:基於Netty框架的事件驅動的通信層,其方法調用是異步的。Redisson的API是線程安全的,所以可以操作單個Redisson連接來完成各種操作。
- Redisson不僅提供了一系列的分布式Java常用對象,基本可以與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)。
- Lettuce:基於Netty框架的事件驅動的通信層,其方法調用是異步的。Lettuce的API是線程安全的,所以可以操作單個Lettuce連接來完成各種操作。
為什么說Jedis是非線程安全的呢?
因為發送命令和獲取返回值時使用全局變量RedisOutputStream和RedisInputStream(redis.clients.jedis.Connection類中)。
當不同的線程在set和get的時候,有可能會出現線程A的set()的響應流,被線程B的get()作為返回了,所以出現了線程安全問題。
通過JedisPool連接池去管理實例,在多線程情況下讓每個線程有自己的獨立的jedis實例,從而避免了線程安全問題。