本文主要测试对比目前 jedis客户端+codis集群 和 lettuce客户端+redis集群 的性能对比,主要测试业务最多使用的get和mget命令。
PS:redis集群为redis官方提供但并不支持mget功能,但lettuce客户端在业务层帮助实现了mget功能;codis集群为豌豆荚开发的redis分布式集群,本身支持mget功能,底层实例也是单个redis实例。
压测环境
一、Codis集群
架构:3个分片,每个分片1个master,2个slave
实例:8G内存
版本:3.2.11
机器:物理机三台(32cpu,128g)
配置:常用配置项 持久化关闭
二、Redis集群
架构:3个分片,每个分片1个master,2个slave
实例:8G内存
版本:3.2.11
机器:同机房物理机三台(32cpu,128g)
配置:与codis集群配置项相同
三、接口服务
部署方式:java web服务 单点部署 同时提供jedis+codis与lettuce+redis的接口
启动参数:java -Duser.timezone=GMT+08 -Xmx4G -Xms4G -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -jar /opt/data/lettuce-test-0.0.1-SNAPSHOT.jar
部署机器:32CPU/128G 同机房物理机
Jedis客户端:使用连接池
Lettuce客户端:非连接池同步/异步命令,以及同步连接池,和异步连接池
wrk机器:2CPU/8G 同机房虚拟机
wrk命令:wrk -t4 -c100 -d30s {url}
压测结果
一、Get命令测试
客户端 | QPS | Latency-Avg | Transfer/sec |
---|---|---|---|
jedis | 48724.08 | 2.64ms | 7.72MB |
lettuce-sync | 73503.32 | 1.99ms | 11.65MB |
lettuce-async | 78309.92 | 1.42ms | 12.41MB |
lettuce-sync-pool | 8859.18 | 12.10ms | 1.40MB |
lettuce-async-pool | 43452.51 | 8.86ms | 6.56MB |
二、Mget命令测试
客户端 | QPS | Latency-Avg | Transfer/sec |
---|---|---|---|
jedis | 25854.20 | 4.20ms | 79.23MB |
lettuce-sync | 3618.35 | 28.70ms | 20.26MB |
lettuce-async | 3932.65 | 25.41ms | 22.02MB |
lettuce-sync-pool | 1967.92 | 50.89ms | 11.18MB |
lettuce-async-pool | 11764.77 | 13.57ms | 48.46MB |
PS:mget一次获取50个固定元素,用scan命令获取。
压测结论
- Get命令lettce客户端表现优于jedis客户端。
- Mget命令jedis客户端表现由于lettuce客户端。
- Lettuce的异步命令(async)在压测情况下总体上都比同步命令(sync)表现优秀。
结论分析
如上片博客Lettuce源码分析-MGET原理所述,Lettuce是把key根据slot进行分组,将在同一个slot的命令一起发送到对应的节点,再将所有请求的返回值合并作为最终结果。测试的50个key分属与不同的50个slot势必效率不会很高,因为无法避免50次访问集群,即便使用异步并行访问。而Codis理论上应该类似也会按slot分组执行mget,但是它用管道pipeline对同一shard的key做了优化,效率有明显提升。