Redisson vs Jedis for redis [关闭]

Posted

技术标签:

【中文标题】Redisson vs Jedis for redis [关闭]【英文标题】:Redisson vs Jedis for redis [closed] 【发布时间】:2017-07-04 04:57:38 【问题描述】:

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

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

就速度而言,哪个效率更高?有什么基准吗?

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

分布式锁(并更新映射中的一些键)

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

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

【问题讨论】:

在我看来,Reddison 更适合您的任务,因为它至少涵盖了列表中的一点 [github.com/redisson/redisson/wiki/…。使用 Jedis 你应该自己实现它,因为 Jedis 只是 Redis 的一个有用的 Java API 【参考方案1】:

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

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 由套接字处理。没有异步(FutureCompletableFuture)或响应式支持(RxJava Observable 或响应式流Publisher)。

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

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

关于客户端实现的意见

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

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

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

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

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

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

展望

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

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

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

【讨论】:

感谢您如此深入的解释! I'm not entirely sure, but maybe you can even operate on a single connection. 可以肯定的是,Redisson 只能使用一个连接 :) @NikitaKoksharov 当您说 redisson 是异步的时,它通过在 1 个线程执行程序或队列上排队消息来实现这一点?具有要发送和接收的消息队列的池连接。 redisson 在这里有何不同。此外,Jedis 是同步的,但鉴于我刚才提到的基于队列的系统,您可以将其包装在未来。 redisson 真的可以在一个客户端上管理多个线程的通信吗? 或者每个连接是否有一个线程(执行程序)处理来自线程的各个线程的传入排队命令,一次一个命令。使用这种模式,它将允许各种线程进行通信,但其核心只发送一个命令,收到响应,然后可以发送下一个命令。对吗? 我认为人们对它的看法存在很大差异。如果 redisson 确实能够通过一个连接使用多个线程进行通信,那么它从根本上不同于无法做到这一点的 jedis,但我不确定它是否可以。你能澄清一下吗?它可以只使用一个redis连接同时从多个线程发送和接收多个命令吗? @mmm 所有发送的 Redis 请求/响应都由 nettyThreadGroup 处理,它有多个线程,可以通过 nettyThreads 设置进行更改。

以上是关于Redisson vs Jedis for redis [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

redis客户端选型-Jedis、lettuce、Redisson

Jedis与Redisson对比有什么优缺点?

redisson 应用(二)

Redisson连接redis单机和哨兵模式

redisson 应用(一)

SpringBoot集成redisson操作redis