Redis都要老了,你还在用什么古董客户端?

存储 存储软件 Redis
前几日,Redis 创始人 Antirez 在他的个人博客上宣布将结束自己的 Redis 之旅!

本文转载自微信公众号「小姐姐味道」,作者小姐姐养的狗。转载本文请联系小姐姐味道公众号。

前几日,Redis 创始人 Antirez 在他的个人博客上宣布将结束自己的 Redis 之旅!

[[332526]]

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

Redis的Java客户端有很多,比如jedis、redisson、lettuce等。

那大家都在用啥呢?

今天xjjdog做了一个小调查。下面是统计结果。

 

可以看到jedis以绝对的优势占据了榜首。

下面简单的分析一小下。

jedis

 

jedis和redis只相差1个字母。我通常把它叫做redis和Java的合体。它有以下特点:

  • 非常的轻量级、简洁,非常方便进行改造和集成
  • 支持单机、哨兵、Cluster等部署模式,支持事务、pipeline、LUA脚本等。功能齐全。
  • 不支持读写分离,需要自己实现
  • 使用了BIO模型,方法调用是同步的
  • jedis客户端实例不是线程安全的,需要使用连接池来使用
  • 支持连接池

代码样例。

  1. Jedis jedis = null
  2. try { 
  3.   jedis = pool.getResource(); 
  4.   /// ... do stuff here ... for example 
  5.   jedis.set("foo""bar"); 
  6.   String foobar = jedis.get("foo"); 
  7.   jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike"); 
  8.   Set<String> sose = jedis.zrange("sose", 0, -1); 
  9. } finally { 
  10.   // You have to close jedis object. If you don't close then 
  11.   // it doesn't release back to pool and you can't get a new 
  12.   // resource from pool. 
  13.   if (jedis != null) { 
  14.     jedis.close(); 
  15.   } 
  16. /// ... when closing your application: 
  17. pool.close(); 

redisson

 

我通常把它叫做redis的儿子。由于是儿子,所以有些功能并不支持。

  • 提供分布式锁等常见的操作封装,并实现了分布式和可扩展的Java数据结构,但不支持一些基础的Redis原生功能
  • 基于Netty实现,采用非阻塞IO,性能高。支持异步的请求
  • 不支持事务操作,可以使用LUA脚本实现
  • 支持在主从部署和cluster部署模式下的读写分离。在此基础上,支持读操作负载均衡
  • api是线程安全的,单个连接可以完成多个操作
  • 可以与Spring Session集成实现会话共享
  • 支持连接池
  • 有中文文档 O__O

代码样例。

  1. // 1. Create config object 
  2. Config config = new Config(); 
  3. config.useClusterServers() 
  4.        // use "rediss://" for SSL connection 
  5.       .addNodeAddress("redis://127.0.0.1:7181"); 
  6.  
  7. // or read config from file 
  8. config = Config.fromYAML(new File("config-file.yaml")); 
  9.  
  10. // 2. Create Redisson instance 
  11.  
  12. // Sync and Async API 
  13. RedissonClient redisson = Redisson.create(config); 
  14.  
  15. // RxJava2 API 
  16. RedissonRxClient redissonRx = Redisson.createRx(config); 
  17.  
  18. // 3. Get Redis based Map 
  19. RMap<MyKey, MyValue> map = redisson.getMap("myMap"); 
  20.  
  21. RMapReactive<MyKey, MyValue> mapReactive = redissonReactive.getMap("myMap"); 
  22.  
  23. RMapRx<MyKey, MyValue> mapRx = redissonRx.getMap("myMap"); 
  24.  
  25. // 4. Get Redis based Lock 
  26. RLock lock = redisson.getLock("myLock"); 
  27.  
  28. RLockReactive lockReactive = redissonReactive.getLock("myLock"); 
  29.  
  30. RLockRx lockRx = redissonRx.getLock("myLock"); 

Lettuce

生菜的意思,应该是图腾,因为和我想不起和redis的任何联系。

 

  • 基于Netty框架的事件驱动的通信层,方法调用也是异步的
  • 不需要考虑线程池,性能比较高,Spring生态默认
  • api是线程安全的,单个连接可以完成多个操作
  • 同样支持连接池

代码案例。

  1. RedisClient client = RedisClient.create("redis://localhost"); 
  2. StatefulRedisConnection<String, String> connection = client.connect(); 
  3. RedisStringCommands sync = connection.sync(); 
  4. String value = sync.get("key"); 
  5.  
  6. //////////////////// 
  7. StatefulRedisConnection<String, String> connection = client.connect(); 
  8. RedisStringAsyncCommands<String, String> async = connection.async(); 
  9. RedisFuture<String> set = async.set("key""value"
  10. RedisFuture<String> get = async.get("key"
  11.  
  12. async.awaitAll(set, get) == true 
  13.  
  14. set.get() == "OK" 
  15. 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。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。

 

责任编辑:武晓燕 来源: 小姐姐味道
相关推荐

2012-07-19 10:03:32

2009-11-05 13:08:44

WCF客户端配置

2022-01-19 09:03:01

工具

2021-09-22 15:46:29

虚拟桌面瘦客户端胖客户端

2011-08-17 10:10:59

2022-09-05 14:36:26

服务端TCP连接

2024-04-11 09:17:51

ArraysJava安全

2020-03-04 14:05:35

戴尔

2010-05-31 10:11:32

瘦客户端

2013-07-04 10:01:04

2011-03-02 14:36:24

Filezilla客户端

2011-03-24 13:00:31

配置nagios客户端

2010-12-21 11:03:15

获取客户端证书

2011-10-26 13:17:05

2021-08-01 23:18:21

Redis Golang命令

2013-03-20 11:01:37

Redis客户端连接

2011-03-21 14:53:36

Nagios监控Linux

2011-04-06 14:24:20

Nagios监控Linux

2009-03-04 10:27:50

客户端组件桌面虚拟化Xendesktop

2013-05-09 09:33:59

点赞
收藏

51CTO技术栈公众号