45

现在我必须为 redis 使用 java 客户端。我遇到过JedisRedisson

编辑:重新定义问题是基于意见的。

哪个在速度方面更有效?任何基准?

他们中的哪一个能够提供以下内容?

  • 分布式锁(并更新地图中的一些键)

  • 自动密钥到期通知,但我希望仅由一组订阅者中的一个特定订阅者接收(类似于 Apache Kafka 中的消费者组概念)。如何做到这一点?

PS:请不要将其标记为重复

4

1 回答 1

79

这个问题是基于意见的,但让我们得到一些客观的观点:

TL; 博士:

驱动程序的选择取决于多种因素:

  • 其他依赖项
  • 编程模型
  • 可扩展性
  • 对高级功能的实现持固执己见
  • 您的项目前景,您想要发展的方向

解释

其他依赖项

在添加库时,一些项目对附加依赖项和临时依赖项持意见。

Jedis 几乎没有依赖关系,它需要 Apache Commons Pool 2 进行连接池。

Redisson 需要 Netty、JCache API 和 Project Reactor 作为基本依赖项。它是可扩展的,因为它与许多其他库(Tomcat 会话存储)集成。

编程模型

这就是您与 Redis 客户端交互的方式。它还定义了抽象级别。

Jedis 是一个将 Redis API 暴露为 Java 方法调用的低级驱动程序:

Jedis jedis = …;

jedis.set("key", "value");

List<String> values = jedis.mget("key", "key2", "key3");

Redisson 是一个高级客户端,它通过各种 API 对象公开其功能:

Redisson redisson = …

RMap map = redisson.getMap("my-map"); // implement java.util.Map

map.put("key", "value");

map.containsKey("key");

map.get("key");

每个调用都会调用一个或多个 Redis 调用,其中一些是用 Lua(Redis “脚本”)实现的。

可扩展性

有多种适用于 Java 的驱动程序具有可能适合您的项目的各种属性。可扩展性也在其中发挥作用。着眼于驱动程序,它归结为驱动程序如何使用他们的资源以及他们支持哪些编程模型。

Jedis 使用阻塞 I/O,方法调用是同步的。您的程序流需要等到 I/O 由套接字处理。没有异步 ( Future, CompletableFuture) 或响应式支持(RxJavaObservable或 Reactive Streams Publisher)。

Jedis 客户端实例不是线程安全的,因此它们需要连接池(每个调用线程的 Jedis 实例)。

Redisson 使用非阻塞 I/O 和带有 netty 的事件驱动通信层。方法调用是同步的、异步的或反应式的(通过 Project Reactor 2.0 或 3.1)。连接是池化的,但 API 本身是线程安全的并且需要更少的资源。我不完全确定,但也许你甚至可以在单个连接上操作。这是使用 Redis 时最有效的方式。

关于客户端实施的意见

这些段落涉及如何实现客户端。

这两个客户端都具有出色的功能覆盖率,您可以使用这两个库来满足您的要求。

Jedis 是一个简单的实现,它只是将命令写入 anOutputStream并解析响应。仅此而已。

如果您想要高级功能,则需要使用 Redis API 来实现这些功能。它使您可以完全控制您调用的命令和结果行为。在这里实现您的功能可能需要额外的努力。

Redisson 是一个高级客户端,通过其抽象提供功能。虽然您可以使用这些对象而无需知道它们是由 Redis ( Map, List, Set, ...) 支持的,但每个 API 调用都会转换为一个或多个 Redis 调用,其中一些会转换为 Lua 脚本执行。

您可能喜欢或不喜欢 Redisson 的行为方式以及它如何实现这些功能,但最终,您无能为力。使用 Redisson 的高级功能可能会减少您的实施工作。

外表

该部分完全取决于您要去的地方。Jedis 支持所有 Redis API 命令,Redis Standalone、Redis Sentinel 和 Redis Cluster。主从设置中没有从读取,但我认为 jedis 提供这些功能只是时间问题。

使用 jedis,您无法实现异步,并且使用 AWS ElastiCache 的高级功能或从属读取需要您自己的实施。

Redisson 广泛涵盖各种设置。它支持 Jedis 支持的所有内容,并为主/从设置提供读取策略,改进了对 AWS ElastiCache 的支持。

于 2017-02-15T16:58:12.187 回答