首页 文章

Redisson vs Jedis for redis [关闭]

提问于
浏览
19

现在我必须使用java客户端进行redis . 我遇到了JedisRedisson .

EDIT :重新定义,因为问题是基于意见的 .

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

哪个能够提供以下哪些?

  • 分布式锁(并更新 Map 中的某些键)

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

PS:请不要将其标记为this的副本 .

1 回答

  • 36

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

    TL; DR:

    司机的选择取决于多种因素:

    • 其他依赖项

    • 编程模型

    • 可扩展性

    • 对高级功能的实施持主观态度

    • 您的项目前景,您想要发展的方向

    解释

    其他依赖项

    在添加库时,有些项目会考虑其他依赖项和瞬态依赖项 .

    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“Scripting”)实现 .

    可扩展性

    有多个可用于Java的驱动程序,它们具有适合您项目的各种属性 . 可扩展性也适用于此 . 看看驱动程序,它归结为驱动程序,如何使用它们的资源以及它们支持的编程模型 .

    Jedis使用阻塞I / O,方法调用是同步的 . 您的程序流程必须等到套接字处理I / O.没有异步( FutureCompletableFuture )或反应支持(RxJava Observable 或Reactive Streams 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的行为方式以及它如何实现这些功能,但最终,您无法做到这一点 . 使用Redissons高级功能可能会减少您的实施工作 .

    展望

    该部分完全取决于您前往的目的地 . Jedis支持所有Redis API命令,Redis Standalone,Redis Sentinel和Redis Cluster . 在主从设置中没有从属读取,但我认为这只是时间问题,直到jedis将提供这些功能 .

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

    Redisson具有广泛的各种设置 . 它支持Jedis支持的所有功能,并为Master / Slave设置提供读取策略,改进了对AWS ElastiCache的支持 .

相关问题