【需求背景】
由于集群模式下 Spring 对 jedis 的封装,在使用批量方法 (mget、delete) 时会把任务都提交到仅有一个核心线程的 executor 中执行,在高并发场景下会造成应用内大量任务处于排队状态而得不到执行。
具体参考:https://juejin.cn/post/6844904115445694472
【 jedis 和 lettuce 的区别】
-
lettuce 底层使用了 pipeline 实现了批量命令的功能,解决 mget 的问题。具体查看类:io.lettuce.core.cluster.api.async.RedisAdvancedClusterAsyncCommands
-
jedis 使用了线程池来解决 mget 的问题,具体查看类:org.springframework.data.redis.connection.jedis.JedisClusterStringCommands
综合性能对比,肯定是使用 pipeline 更加高效,这是原生 Redis 支持的功能。
【实践】
修改 nacos 的配置:spring.redis.client.type=lettuce 即可实现。
sls 查看启用哪个实例:LettuceRedisConfiguration 或 JedisConnectionFactory
【性能分析】
1、压测机器
serviceA 1台
serviceB 1台
其他依赖:全部依赖于生产环境的实例
2、压测接口
查询单个用户购物车,购物车数量很大的情况。
3、压测结果
4、压测分析
-
对于单个 get 请求来说,对比第4个和第5个用例,对比第7个和第8个用例,jedis 性能与 lettuce 框架性能相当,差别不大。
-
对于 mget 批量请求来说,对比第1个和第3个用例,lettuce 性能明显好于 jedis 框架。
-
对于 lettuce 框架来说,对比第2个和第6个用例来说,默认策略 shareNativeConnection=true 要明显好于 shareNativeConnection=false,因此保留默认配置。
5、最终结论
如果要使用 mget 批量命令的话,建议使用 lettuce 框架,并且保留默认配置:shareNativeConnection=true。
如果不使用批量命令,lettuce 框架和 jedis 框架性能相当。
综上所述,还是 lettuce 框架性能更优。