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

栏目: IT技术 · 发布时间: 4年前

内容简介:推荐阅读:

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

不羡鸳鸯不羡仙,一行代码调半天。原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。

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

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

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

那大家都在用啥呢?

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

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

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

下面简单的分析一小下。

jedis

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

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

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

我通常把它叫做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的任何联系。

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

  • 基于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,欢迎添加好友,进一步交流。

后台回复“ 加群 ”,带你进入高手如云交流群

推荐阅读:


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Developer's Guide to Social Programming

Developer's Guide to Social Programming

Mark D. Hawker / Addison-Wesley Professional / 2010-8-25 / USD 39.99

In The Developer's Guide to Social Programming, Mark Hawker shows developers how to build applications that integrate with the major social networking sites. Unlike competitive books that focus on a s......一起来看看 《Developer's Guide to Social Programming》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具