Redis都要老了,你還在用什麼古董客戶端?

不羨鴛鴦不羨仙,一行代碼調半天。原創:小姐姐味道(微信公衆號ID:xjjdog),歡迎分享,轉載請保留出處。java

前幾日,Redis 創始人 Antirez 在他的我的博客上宣佈將結束本身的 Redis 之旅!程序員

大神累了,Redis老了,但Redis依舊很火。redis

Redis的Java客戶端有不少,好比jedis、redisson、lettuce等。編程

那你們都在用啥呢?api

今天xjjdog作了一個小調查。下面是統計結果。 localfile://media/15940259145555/15940262979977.jpg 安全

能夠看到jedis以絕對的優點佔據了榜首。微信

下面簡單的分析一小下。數據結構

jedis

localfile://media/15940259145555/15940301796032.jpg 架構

jedis和redis只相差1個字母。我一般把它叫作redis和Java的合體。它有如下特色:併發

  • 很是的輕量級、簡潔,很是方便進行改造和集成
  • 支持單機、哨兵、Cluster等部署模式,支持事務、pipeline、LUA腳本等。功能齊全。
  • 不支持讀寫分離,須要本身實現
  • 使用了BIO模型,方法調用是同步的
  • jedis客戶端實例不是線程安全的,須要使用鏈接池來使用
  • 支持鏈接池

代碼樣例。

Jedis jedis = null;
try {
  jedis = pool.getResource();
  /// ... do stuff here ... for example
  jedis.set("foo", "bar");
  String foobar = jedis.get("foo");
  jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike"); 
  Set<String> sose = jedis.zrange("sose", 0, -1);
} finally {
  // You have to close jedis object. If you don't close then
  // it doesn't release back to pool and you can't get a new
  // resource from pool.
  if (jedis != null) {
    jedis.close();
  }
}
/// ... when closing your application:
pool.close();
複製代碼

redisson

localfile://media/15940259145555/15940302787489.jpg

我一般把它叫作redis的兒子。因爲是兒子,因此有些功能並不支持。

  • 提供分佈式鎖等常見的操做封裝,並實現了分佈式和可擴展的Java數據結構,但不支持一些基礎的Redis原生功能
  • 基於Netty實現,採用非阻塞IO,性能高。支持異步的請求
  • 不支持事務操做,可使用LUA腳本實現
  • 支持在主從部署和cluster部署模式下的讀寫分離。在此基礎上,支持讀操做負載均衡
  • api是線程安全的,單個鏈接能夠完成多個操做
  • 能夠與Spring Session集成實現會話共享
  • 支持鏈接池
  • 有中文文檔 O__O

代碼樣例。

// 1. Create config object
Config config = new Config();
config.useClusterServers()
       // use "rediss://" for SSL connection
      .addNodeAddress("redis://127.0.0.1:7181");

// or read config from file
config = Config.fromYAML(new File("config-file.yaml")); 

// 2. Create Redisson instance

// Sync and Async API
RedissonClient redisson = Redisson.create(config);

// RxJava2 API
RedissonRxClient redissonRx = Redisson.createRx(config);

// 3. Get Redis based Map
RMap<MyKey, MyValue> map = redisson.getMap("myMap");

RMapReactive<MyKey, MyValue> mapReactive = redissonReactive.getMap("myMap");

RMapRx<MyKey, MyValue> mapRx = redissonRx.getMap("myMap");

// 4. Get Redis based Lock
RLock lock = redisson.getLock("myLock");

RLockReactive lockReactive = redissonReactive.getLock("myLock");

RLockRx lockRx = redissonRx.getLock("myLock");
複製代碼

Lettuce

生菜的意思,應該是圖騰,由於和我想不起和redis的任何聯繫。 localfile://media/15940259145555/15940301291245.jpg

  • 基於Netty框架的事件驅動的通訊層,方法調用也是異步的
  • 不須要考慮線程池,性能比較高,Spring生態默認
  • api是線程安全的,單個鏈接能夠完成多個操做
  • 一樣支持鏈接池

代碼案例。

RedisClient client = RedisClient.create("redis://localhost");
StatefulRedisConnection<String, String> connection = client.connect();
RedisStringCommands sync = connection.sync();
String value = sync.get("key");

////////////////////
StatefulRedisConnection<String, String> connection = client.connect();
RedisStringAsyncCommands<String, String> async = connection.async();
RedisFuture<String> set = async.set("key", "value")
RedisFuture<String> get = async.get("key")

async.awaitAll(set, get) == true

set.get() == "OK"
get.get() == "value"
複製代碼

小小分析

jedis支持最原生的操做,什麼都能幹,可是它的表達語義是有限的,可能寫了一堆getset,可是還得靠註釋來明白這段代碼是幹啥的。但同時帶來的好處就是可塑性強,能夠根據本身的需求把它扭成合適的樣子。另外,jedis仍是BIO的,雖然BIO通常來講都比較慢,可是redis自己就是很快的,不會阻塞好久,這個在普通項目裏並無什麼大的問題。

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)。它基於Netty,支持NIO,速度上天然就快一點。我仍是經過它實現的一些高級api上知道的它,最著名的就是它的分佈式鎖,能夠像使用Java的可重入鎖同樣使用它。

Lettuce是生菜的意思,也是Spring的RedisTemplate如今默認的底層實現。比起jedis須要爲每一個實例建立物理鏈接來保證線程安全,lettuce確實很優秀。它的性能比較高,支持異步。性能雖然高,可是編程模型比較複雜,不太直觀,不少人不太喜歡。


目前來看,大多數項目還在用着BIO的jedis,這沒什麼問題。jedis的功能齊全,api比較初級好定製,性能也能知足需求。更重要的是,它先入爲主,已經成了不少人的標配。

若是在功能上、性能上,已經知足需求,那又有什麼理由去換一個新的呢?是閒的蛋疼麼?

羞刀難入鞘,傲劍不回鋒 ?不存在的。

若是有了Spring封裝的這一層,屏蔽了這些蛋疼的切換操做,又有什麼理由不換一個快的呢?

做者簡介:小姐姐味道 (xjjdog),一個不容許程序員走彎路的公衆號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高併發世界,給你不同的味道。個人我的微信xjjdog0,歡迎添加好友,​進一步交流。​

相關文章
相關標籤/搜索