Jedis、Lettuce和Redisson性能设计

ops/2025/3/6 3:18:55/

一、Jedis源码级学习要点

1. 线程模型与连接管理

  • 阻塞式I/O设计:通过Socket直接建立连接,每个命令发送后线程会阻塞等待响应25
  • 连接池实现:JedisPool管理物理连接,避免线程安全问题,核心类GenericObjectPool实现连接复用57
  • 资源竞争优化:JedisCluster通过哈希槽映射实现集群命令路由,关键类JedisSlotBasedConnectionHandler处理节点定位5

2. 高性能设计

  • 二进制协议优化:BinaryJedis类支持原生二进制操作,减少序列化开销5
  • 管道批处理:Pipeline类实现批量命令打包发送,减少网络往返次数(10万次操作耗时从4秒降至0.6秒)5
  • 序列化扩展:通过JedisCluster.NodeResource支持自定义序列化协议5

3. 核心源码结构

  • 命令执行入口:Jedis#sendCommand()方法封装协议组装逻辑
  • 响应解析:Protocol#process()方法处理RESP协议解析
  • 异常处理:JedisConnectionException捕获网络层异常

个人总结

老生常谈的web应用性能两大重点:多线程&IO;
Jedis使用的是BIO模型,在高并发要求下性能是不会比NIO模型好
在这里插入图片描述
虽然是BIO阻塞读写,但Pipeline模式可以一次性发送多条指令,不等待指令执行结果传回后再执行下一条指令;
Pipline模式允许异步等待返回而非指令串行,这可以轻松提升十倍;
在这里插入图片描述
Pipeline内部有序存储指令执行顺序,有序读取网络io返回;
在这里插入图片描述
但这本身就说redis提供的能力,io-stream同时可以写入多条指令,只要按执行顺序读取就行,相比正常模式下,发送指令后要等待指令返回,pipeline对可以批量执行的指令提升很大, 但多数业务场景下都需要指令实时返回结果;

二、Lettuce源码级学习要点

1. 异步通信架构

  • Netty事件驱动:基于EventLoopGroup实现非阻塞I/O,核心类ChannelHandler处理命令编解码
  • 连接复用机制:StatefulRedisConnection线程安全,支持多线程共享连接
  • 响应式扩展:通过RedisReactiveCommands实现Reactive Streams支持

2. 同步/异步转换机制

  • 动态代理设计:RedisAdvancedClusterCommands接口通过ClusterFutureSyncInvocationHandler将异步结果转为同步
  • Future处理优化:LettuceFutures.awaitOrCancel() 实现带超时的异步结果等待

3. 集群支持设计

  • 拓扑动态更新:ClusterTopologyRefresh定时刷新集群节点状态
  • 自适应路由:PartitionSelector根据哈希槽动态选择目标节点

个人总结

使用了Netty做客户端的io管理,没有所谓的pipeline模式: 如果理解pipeline的实现原理可以发现该功能只是开放了异步等待结果;
使用Netty(NIO模型)对比Jedis的BIO模型网络性能更嘉,同时多线程共享连接;
在这里插入图片描述
Lettuce 的默认设计每个client(连接)不支持线程安全,如使用RedisAsyncCommands(异步模式),如果多线程调用flushall会影响其他线程的执行节奏;
在这里插入图片描述
Lettuce 基于 Apache Common-pool2 组件提供了连接池的能力,没有自带的池化实现;
Lettuce 相较于Jedis,使用上更加方便快捷,抽象度高。并且通过线程安全的连接降低了系统中的连接数量,提升了系统的稳定性。

三、Redisson源码级学习要点

1. 分布式数据结构实现

  • 对象代理机制:RMap、RList等通过RedissonObject封装Redis命令,实现Java集合接口
  • 锁续期设计:RedissonLock使用看门狗线程(LockWatchdog)自动延长锁有效期

2. 网络通信优化

  • 连接池扩展:ConnectionManager支持单连接/连接池混合模式,针对不同操作类型优化
  • PubSub高效分发:PubSubConnectionEntry管理订阅通道,实现消息的线程安全分发

3. 分布式锁实现

  • Lua脚本原子性:加锁操作通过EVAL命令执行Lua脚本保证原子性
  • 红锁算法:RedissonRedLock实现多节点加锁的容错机制

个人理解

同样使用Netty
在这里插入图片描述
创建了一个独立线程池实现watch dog等高级功能
在这里插入图片描述
Redisson提供的更多高级功能,同时也提供的深度的抽象;

四、对比与选型指导

维度JedisLettuceRedisson
线程模型阻塞I/O+连接池非阻塞I/O(Netty)非阻塞I/O+分布式扩展
性能瓶颈高并发时连接池竞争单连接支持高并发复杂操作有额外开销
适用场景简单同步操作高吞吐量/响应式编程分布式系统/复杂数据结构

五、基准测试

客户端基准测试说明
Jedis3.754单个连接不支持并发,只能串行,对于web应用而已,业务处理线程肯定比连接数量高
Lettuce7.892支持并发操作,非阻塞占用单个连接
Redisson5.453支持并发操作,高级线程连接池管理

如果连接需求>能提供的连接数量,优先选择基于netty的Lettuce和Redisson


http://www.ppmy.cn/ops/163484.html

相关文章

Skynet入门(一)

概念 skynet 是一个为网络游戏服务器设计的轻量框架。但它本身并没有任何为网络游戏业务而特别设计的部分,所以尽可以把它用于其它领域。 设计初衷 如何充分利用它们并行运作数千个相互独立的业务。 模块设计建议 在 skynet 中,用服务 (service) 这…

中科大 计算机网络组成原理 1.4 接入网和物理媒体 笔记

一、接入网核心功能与架构 ‌核心作用‌ 接入网是连接用户终端与核心网络的桥梁,承担用户身份认证、带宽分配、数据加密等功能,直接影响网络服务的可靠性和用户体验。例如,杭州电视台的数字人主播通过光纤专线实现零失误新闻播报,…

Unity插件-Mirror使用方法(五)组件介绍(​Network Identity)

目录 一、插件介绍 二、主要组件 Network Manager Network Manager HUD 三、Network Identity 1、组件介绍 2、核心功能 网络唯一标识 同步生命周期 权限管理 组件依赖 3、关键属性与配置 4、基础使用方法 1. 添加与配置 2. 脚本中的访问 5、高级功能与示例 1…

Arm64架构的Linux服务器安装jdk8

一、下载 JDK8 打开浏览器,访问 oracle官网找到适用于自己服务器的 arm64 架构的 JDK8 安装包。 二、安装 JDK8 将下载好的 JDK 压缩包上传到服务器上 解压 JDK 压缩包: tar -zxvf jdk-8uXXX-linux-arm64.tar.gz选择安装目录,我将 JDK 安装…

AI大模型-提示工程学习笔记22-元提示(meta-prompting)

目录 1. 元提示的核心思想 (1) 传统提示的局限性 (2) Meta-Prompting 的解决方案 2. Meta-Prompting 的工作流程 (1) 元提示输入 (2) 提示生成 (3) 提示评估 (可选) (4) 提示选择 (可选) (5) 任务执行 3. Meta-Prompting 的关键组件 (1) 大语言模型 (LLM) (2) 元提…

【数据结构-图】

💖💝亲亲, 创作不易 看完点点专注呀♥❤💕💞 【图】 目录:图的基本概念与表示方法知识点总结及示例1. 图的定义2. 无向图3. 有向图4. 图的邻接矩阵表示5. 图的邻接表表示 1. 图的邻接矩阵表示有向图邻接矩…

【蓝桥杯单片机】第十二届省赛

一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 由Y5C控制 2.编写LED函数(led.c) void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器…

从Java到MySQL8源码:深入解析PreparedStatement参数绑定与执行机制

引言 在数据库开发中,PreparedStatement(预处理语句)是防止SQL注入、提升性能的重要工具。它通过分离SQL结构与参数值,不仅增强了安全性,还能利用预编译优化执行效率。本文将从Java JDBC驱动和MySQL 8源码的双重视角&…