Redisson 与 Jedis 之争
Redisson vs Jedis for redis
现在我必须为 redis 使用 java 客户端。我遇到过Jedis and Redisson。
编辑:重新设计问题是基于意见。
哪个在速度方面更有效率?有任何基准吗?
他们中哪一个能够提供以下内容?
分布式锁(并更新map中的一些key)
自动密钥到期通知,但我希望仅由一组订阅者中的一个特定订阅者接收(类似于 Apache Kafka 中的消费者组概念)。如何实现?
PS:请不要将其标记为 this 的副本。
那个问题是 opinion-based 但让我们得到一些 objective 点:
TL;博士:
驱动程序的选择取决于多种因素:
- 其他依赖项
- 编程模型
- 可扩展性
- 对 high-level 功能的实施有自己的看法
- 你的项目前景,你想发展的方向
说明
其他依赖项
有些项目在添加库时对附加依赖项和瞬态依赖项有意见。
Jedis 几乎 dependency-free,它需要 Apache Commons Pool 2 for connection-pooling。
Redisson 需要 Netty、JCache API 和 Project Reactor 作为基本依赖项。它是可扩展的,因为它集成了许多其他库(Tomcat 会话存储)。
编程模型
这就是您与 Redis 客户端交互的方式。它还定义了抽象级别。
Jedis 是一个 low-level 驱动程序,将 Redis API 公开为 Java 方法调用:
Jedis jedis = …;
jedis.set("key", "value");
List<String> values = jedis.mget("key", "key2", "key3");
Redisson 是一个 high-level 客户端,它通过各种 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 "Scripting")。
可扩展性
Java 有多个驱动程序可用,它们具有可能适合您的项目的各种属性。可扩展性也起到了作用。查看驱动程序可以归结为驱动程序如何使用它们的资源以及它们支持哪些编程模型。
Jedis 使用阻塞 I/O 并且方法调用是同步的。您的程序流需要等到 I/O 被套接字处理。没有异步(Future
、CompletableFuture
)或响应式支持(RxJava Observable
或 Reactive Streams Publisher
)。
Jedis 客户端实例不是 thread-safe,因此它们需要 connection-pooling(每个调用线程 Jedis-instance)。
Redisson 使用 non-blocking I/O 和一个带有 netty 的 event-driven 通信层。方法调用是同步的、异步的或反应式的(通过 Project Reactor 2.0 或 3.1)。连接被合并,但 API 本身是 thread-safe 并且需要更少的资源。我不完全确定,但也许您甚至可以在单个连接上进行操作。这是使用 Redis 时最有效的方法。
关于客户端实现的意见
这些段落涉及如何实现客户端。
两个客户端都有很好的功能覆盖,你可以用两个库来满足你的要求。
Jedis 是一个简单的实现,它只是将命令写入 OutputStream
并解析响应。仅此而已。
如果您想要 high-level 功能,则需要使用 Redis API 来实现这些功能。它使您可以完全控制调用的命令和产生的行为。在这里实施您的功能可能需要额外的努力。
Redisson 是一个 high-level 客户端,它通过其抽象提供功能。虽然您可以使用这些对象而无需知道它们受 Redis 支持(Map
、List
、Set
、...),但每个 API 调用都会转换为一个或多个Redis 调用,一些 Lua 脚本执行。
您可能喜欢或不喜欢 Redisson 的行为方式及其实现功能的方式,但最终,您无能为力。使用 Redissons high-level 功能可能会减少您的实施工作。
展望
该部分完全取决于您要去的地方。 Jedis 支持所有 Redis API 命令、Redis Standalone、Redis Sentinel 和 Redis Cluster。 master-slave 设置中没有从读取,但我认为 jedis 提供这些功能只是时间问题。
使用 jedis,您无法进行异步操作,使用 AWS ElastiCache 或从属读取的高级功能需要您自己实施。
Redisson 广泛涵盖各种设置。它支持 Jedis 支持的所有内容,并为 Master/Slave 设置提供读取策略,改进了对 AWS ElastiCache 的支持。
现在我必须为 redis 使用 java 客户端。我遇到过Jedis and Redisson。
编辑:重新设计问题是基于意见。
哪个在速度方面更有效率?有任何基准吗?
他们中哪一个能够提供以下内容?
分布式锁(并更新map中的一些key)
自动密钥到期通知,但我希望仅由一组订阅者中的一个特定订阅者接收(类似于 Apache Kafka 中的消费者组概念)。如何实现?
PS:请不要将其标记为 this 的副本。
那个问题是 opinion-based 但让我们得到一些 objective 点:
TL;博士:
驱动程序的选择取决于多种因素:
- 其他依赖项
- 编程模型
- 可扩展性
- 对 high-level 功能的实施有自己的看法
- 你的项目前景,你想发展的方向
说明
其他依赖项
有些项目在添加库时对附加依赖项和瞬态依赖项有意见。
Jedis 几乎 dependency-free,它需要 Apache Commons Pool 2 for connection-pooling。
Redisson 需要 Netty、JCache API 和 Project Reactor 作为基本依赖项。它是可扩展的,因为它集成了许多其他库(Tomcat 会话存储)。
编程模型
这就是您与 Redis 客户端交互的方式。它还定义了抽象级别。
Jedis 是一个 low-level 驱动程序,将 Redis API 公开为 Java 方法调用:
Jedis jedis = …;
jedis.set("key", "value");
List<String> values = jedis.mget("key", "key2", "key3");
Redisson 是一个 high-level 客户端,它通过各种 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 "Scripting")。
可扩展性
Java 有多个驱动程序可用,它们具有可能适合您的项目的各种属性。可扩展性也起到了作用。查看驱动程序可以归结为驱动程序如何使用它们的资源以及它们支持哪些编程模型。
Jedis 使用阻塞 I/O 并且方法调用是同步的。您的程序流需要等到 I/O 被套接字处理。没有异步(Future
、CompletableFuture
)或响应式支持(RxJava Observable
或 Reactive Streams Publisher
)。
Jedis 客户端实例不是 thread-safe,因此它们需要 connection-pooling(每个调用线程 Jedis-instance)。
Redisson 使用 non-blocking I/O 和一个带有 netty 的 event-driven 通信层。方法调用是同步的、异步的或反应式的(通过 Project Reactor 2.0 或 3.1)。连接被合并,但 API 本身是 thread-safe 并且需要更少的资源。我不完全确定,但也许您甚至可以在单个连接上进行操作。这是使用 Redis 时最有效的方法。
关于客户端实现的意见
这些段落涉及如何实现客户端。
两个客户端都有很好的功能覆盖,你可以用两个库来满足你的要求。
Jedis 是一个简单的实现,它只是将命令写入 OutputStream
并解析响应。仅此而已。
如果您想要 high-level 功能,则需要使用 Redis API 来实现这些功能。它使您可以完全控制调用的命令和产生的行为。在这里实施您的功能可能需要额外的努力。
Redisson 是一个 high-level 客户端,它通过其抽象提供功能。虽然您可以使用这些对象而无需知道它们受 Redis 支持(Map
、List
、Set
、...),但每个 API 调用都会转换为一个或多个Redis 调用,一些 Lua 脚本执行。
您可能喜欢或不喜欢 Redisson 的行为方式及其实现功能的方式,但最终,您无能为力。使用 Redissons high-level 功能可能会减少您的实施工作。
展望
该部分完全取决于您要去的地方。 Jedis 支持所有 Redis API 命令、Redis Standalone、Redis Sentinel 和 Redis Cluster。 master-slave 设置中没有从读取,但我认为 jedis 提供这些功能只是时间问题。
使用 jedis,您无法进行异步操作,使用 AWS ElastiCache 或从属读取的高级功能需要您自己实施。
Redisson 广泛涵盖各种设置。它支持 Jedis 支持的所有内容,并为 Master/Slave 设置提供读取策略,改进了对 AWS ElastiCache 的支持。