【Redis】Redis和Codis的MGET性能测试(压测)

本文主要测试对比目前 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命令获取。 

压测结论

  1. Get命令lettce客户端表现优于jedis客户端。
  2. Mget命令jedis客户端表现由于lettuce客户端。
  3. Lettuce的异步命令(async)在压测情况下总体上都比同步命令(sync)表现优秀。

结论分析

如上片博客Lettuce源码分析-MGET原理所述,Lettuce是把key根据slot进行分组,将在同一个slot的命令一起发送到对应的节点,再将所有请求的返回值合并作为最终结果。测试的50个key分属与不同的50个slot势必效率不会很高,因为无法避免50次访问集群,即便使用异步并行访问。而Codis理论上应该类似也会按slot分组执行mget,但是它用管道pipeline对同一shard的key做了优化,效率有明显提升。

你可能感兴趣的:(Redis)