目录
七、springboot项目如何从jedis平滑切换到lettuce
一、引言
在当今的互联网技术领域,Redis 作为一款高性能的键值对存储数据库,被广泛应用于各种场景。而选择合适的 Redis 客户端对于系统的性能、稳定性和开发效率至关重要。本文针对 Jedis、Lettuce、Redisson 这三款主流的 Redis 客户端进行全面对比,为技术选型提供参考。
二、核心特性对比
(一)定位
Jedis:属于轻量级同步客户端,专注于提供基础的 Redis 命令支持,适合简单场景下的快速开发。
Lettuce:是高性能异步 / 响应式客户端,基于 Netty 实现,能够更好地应对高并发场景。
Redisson:作为分布式中间件,进行了高级功能封装,提供了丰富的分布式数据结构和服务。
(二)线程模型
Jedis:采用阻塞式 I/O,且非线程安全,在多线程环境下需要通过连接池来保证线程隔离。
Lettuce:基于 Netty 的非阻塞 I/O,具备线程安全性,单连接可被多线程共享。
Redisson:同样基于 Netty 的非阻塞 I/O,线程安全,其内部封装了线程安全的操作接口。
(三)性能
客户端 |
性能特点 |
优势场景 |
Jedis |
性能中等,依赖连接池提升并发处理能力 |
连接池配置合理的一般场景 |
Lettuce |
性能较高,事件驱动和连接复用机制减少线程切换和连接创建开销 |
高并发场景 |
Redisson |
性能高,底层驱动优秀,高级功能封装对基本操作性能影响小 |
需分布式功能的场景 |
(四)高级功能
客户端 |
支持的高级功能 |
功能特色 |
Jedis |
支持 Pipeline、事务、哨兵、集群等基础特性 |
满足简单 Redis 操作需求 |
Lettuce |
支持异步 / 反应式编程、集群自动重连等功能 |
适合构建响应式系统和高并发微服务 |
Redisson |
提供分布式锁、队列、Map、布隆过滤器等丰富分布式功能 |
分布式系统中作用显著 |
(五)学习成本
(Jedis 最低,Lettuce 中等,Redisson 最高)
客户端 |
学习成本 |
原因 |
Jedis |
低 |
API 贴近 Redis 原生命令,开发者能快速上手 |
Lettuce |
中等 |
需要掌握异步编程模型,熟悉异步编程者更易掌握 |
Redisson |
高 |
抽象了分布式数据结构,需理解分布式相关概念和机制 |
(六)适用场景
客户端 |
适用场景 |
场景特点 |
Jedis |
简单应用、快速原型开发等 |
对高级功能需求不高,注重开发效率 |
Lettuce |
高并发微服务、响应式系统等 |
可发挥异步非阻塞优势 |
Redisson |
分布式系统、需强一致性的业务逻辑场景 |
能解决分布式环境下的各种问题 |
三、深度解析各客户端特点
(一)Jedis
优点:API 设计贴近 Redis 原生命令,上手快,开发者可以快速熟悉并使用其提供的方法进行 Redis 操作;支持 Pipeline、事务、哨兵、集群等基础特性,能满足一般业务场景的需求。
缺点:非线程安全,在多线程环境下需要通过连接池来保证线程安全,增加了一定的配置和管理成本;采用同步阻塞模型,在高并发下易出现线程等待,可能会影响系统的响应速度。
示例代码:
try (Jedis jedis = jedisPool.getResource()) { jedis.set("report:202307", reportData); String data = jedis.get("report:202307"); } |
(二)Lettuce
优点:基于 Netty 的事件驱动模型,性能高,能有效处理高并发请求;线程安全,单连接可跨线程共享,减少了连接创建和管理的开销;集群支持完善,自动处理重定向和故障转移,提高了系统的可用性。
缺点:异步编程模型需一定学习成本,对于习惯同步编程的开发者来说,需要花费时间去适应和掌握。
示例代码:
RedisClient client = RedisClient.create(); StatefulRedisConnection<String, String> connection = client.connect(); RedisAsyncCommands<String, String> commands = connection.async(); commands.get("report:202307").thenAccept(System.out::println); |
(三)Redisson
优点:提供开箱即用的分布式功能,如分布式锁、集合等,简化了分布式系统的开发;内置 Lua 脚本优化,保证原子性,能有效避免并发问题;支持多种部署模式,灵活性高。
缺点:抽象层次高,对原生 Redis 命令支持较弱,在某些需要直接使用原生命令的场景下可能不太方便;依赖较重,小项目可能会因为引入 Redisson 而增加系统的复杂性。
示例代码:
RLock lock = redisson.getLock("reportLock"); lock.lock(); try { // 生成报表逻辑 } finally { lock.unlock(); } |
四、性能对比(大数据量场景)
在大数据量查询性能对比(单次查询 500KB 数据)中,模拟大数据量、低并发环境,在 4 核 CPU/8GB 内存的测试环境下:
(图片展示三者在内存占用、查询吞吐(QPS)、响应延迟(ms)方面的数据,Lettuce 在内存占用和响应延迟上有优势,查询吞吐也较高)
性能指标 |
Jedis |
Lettuce |
Redisson |
内存占用 |
中等 |
较低 |
较高(因高级功能封装) |
查询吞吐(QPS) |
稍逊 |
最优 |
次之 |
响应延迟(ms) |
相对略高 |
较低 |
相对略高 |
五、项目选型建议
基于报表系统数据量巨大、查询为主、并发量低的特点:
优先选择 Lettuce:
高性能非阻塞模型适合大数据量查询
与Spring生态无缝集成,减少配置复杂度
支持流式读取,避免大数据量查询时的内存溢出
线程安全设计,简化资源管理
不推荐 Jedis(阻塞模型)和 Redisson(功能冗余)
六、Lettuce 优化方案
(一)超大结果集处理
使用 Reactive API 流式读取百万级数据,示例如下:
RedisReactiveCommands commands = connection.reactive(); Flux dataFlux = commands.scan(ScanArgs.scanArgs().match("report:*").count(100)); dataFlux.subscribe(key -> commands.hgetall(key).subscribe(processData)); // 分批处理 |
(二)配置优化
在 application.yml 中的配置示例:
客户端 |
选型建议 |
原因 |
Lettuce |
优先选择 |
高性能非阻塞模型适合大数据量查询,与 Spring 生态无缝集成,减少配置复杂度,支持流式读取避免内存溢出,线程安全设计简化资源管理 |
Jedis |
不推荐 |
阻塞模型在大数据量查询场景下性能表现相对较弱 |
Redisson |
不推荐 |
功能存在冗余,增加系统复杂性和学习成本 |
(Lettuce 相关配置参数的合理取值及不同取值对性能的影响)
配置参数 |
取值 |
作用 |
max-active |
8 |
控制连接池最大活跃连接数 |
command-timeout |
30000 |
设置命令超时时间 |
shutdown-timeout |
100 |
设置关闭超时时间 |
spring: redis: lettuce: pool: max-active: 8 command-timeout: 30000 shutdown-timeout: 100 |
(三)监控重点
监控指标 |
作用 |
监控方式建议 |
redis.command.time |
识别慢查询,优化查询语句 |
定期收集分析慢查询日志 |
redis.memory.usage |
防止大报表数据打满内存,确保系统稳定 |
实时监控内存占用情况,设置预警阈值 |
redis.connections.active |
监控连接池使用情况,合理调整连接池参数 |
统计活跃连接数,与连接池配置对比分析 |
七、springboot项目如何从jedis平滑切换到lettuce
springboot项目redis的连接池从jedis切换到lettuce
引入Lettuce依赖
1.1 Lettuce是Spring Boot默认支持的Redis客户端,因此不再需要Jedis相关的依赖。
1.2 jedis依赖移除:确保在pom.xml中删除Jedis相关的依赖,否则可能会导致冲突。
配置Redis连接
在application.yml或application.properties中配置Lettuce连接池。Lettuce默认采用基于Netty的异步通信方式,Spring Boot已经为Lettuce做了默认配置。
spring:
redis:
host: localhost
port: 6379
password: yourpassword # 如果有密码
timeout: 2000 # 连接超时时间
lettuce: # 把之前测jedis配置删除
pool:
max-active: 10 # 最大连接数
max-idle: 5 # 最大空闲连接数
min-idle: 1 # 最小空闲连接数
max-wait: 10000 # 最大等待时间
3、RedisConfig修改,其他不需要改动
4、测试效果
运行项目,日志如下
目前基本适配成功,redis简单操作成功,lettcue连接池生效。