写点什么

阿里云 Redis 与 Tair 压力测评

作者:AlgoRain
  • 2023-07-12
    内蒙古
  • 本文字数:3278 字

    阅读完需:约 11 分钟

阿里云Redis与Tair压力测评

无意中发现阿里云开发社区的训练营活动,其中有一个 7 天玩转 Redis、tair 训练营计划,里面可以免费领取三个月的试用礼包,因为是参营任务,不领取都不行的那种,领取之后放着也是放着,不如跑跑数据看看 Redis 和 Tair 的性能有什么区别,简单的压力测试下,本次测试并不精确,也不具有太多参考意义,真的就是为了测试而测试。


活动地址链接见最下面的

什么是 Tair

这里有具体介绍 Tair 的视频,里面详细介绍了阿里云 Redis 和自建 Redis 的对比分析https://edu.aliyun.com/course/3114106/lesson/19637




测试工作

本次没有使用 Redis 自带的 Redis Benchmark 工具,想着为了测试而测试,就为了测试而开发吧。

一:准备工作

  1. 领取 Redis 与 Tair 三个月免费额度

  2. 编写压力测试代码

  3. 准备测试数据。

二:测试方案设计

  1. 批量插入数据查看总体时延,与不同数据量下时延曲线表,记录总体耗时

  2. 批量数据查询,记录查询 QPS,内存情况,网络流量等

  3. 将数据库内存空间打满后,查看相同淘汰策略下内容优化情况

三:进行压力测试

  1. 先进行功能测试,校验系统功能在高负载下是否正常。

  2. 加大并发用户数或请求流量,模拟峰值压力情况。

  3. 观察记录关键指标,分析系统瓶颈。

四:机器指标

为了去除本地机器、网络带来的干扰,这次的代码都会运行在 ECS 服务器中,但自己的 ECS 服务器都不是杭州区的,还是要通过外网域名的形式连接 Redis、Tair,不过数据传输速率也是可靠的。


五:运行代码:

package org.rain;
import redis.clients.jedis.*;
import java.io.BufferedReader;import java.io.File;import java.io.InputStreamReader;import java.nio.charset.StandardCharsets;import java.nio.file.Files;import java.util.concurrent.*;import java.util.concurrent.atomic.AtomicInteger;
public class Main {
public static void readTxtFile(String filePath, JedisPool pool) { try { File file = new File(filePath); if (file.isFile() && file.exists()) { InputStreamReader isr = new InputStreamReader(Files.newInputStream(file.toPath()), StandardCharsets.UTF_8); BufferedReader br = new BufferedReader(isr); String lineTxt = null; AtomicInteger i = new AtomicInteger(); ExecutorService executorService = new ThreadPoolExecutor(50, 50, 100L, TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>(), new ThreadPoolExecutor.CallerRunsPolicy());
while ((lineTxt = br.readLine()) != null) { String[] textArr = lineTxt.split("\t"); if (textArr.length <= 6) { continue; } executorService.submit(() -> { try (Jedis jedis = pool.getResource()) { jedis.setex(textArr[0] + "-" + i.getAndIncrement(), 14400, textArr[6]); // System.out.println("已处理第" + i); } }); executorService.submit(() -> { try (Jedis jedis = pool.getResource()) { jedis.setex(textArr[1] + "-" + i.getAndIncrement(), 14400, textArr[6]); // System.out.println("已处理第" + i); } }); } System.out.println("处理完毕,共处理:" + i); executorService.shutdown(); br.close(); } else { System.out.println("文件不存在!"); } } catch (Exception e) { System.out.println("文件读取错误!" + e); } }
public static void main(String[] args) { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxIdle(200); config.setMaxTotal(300); config.setTestOnBorrow(false); config.setTestOnReturn(false); String redisHost = "r-.redis.rds.aliyuncs.com"; String redisUser = "r-"; String redisPassword = ""; String tairHost = "r-.redis.rds.aliyuncs.com"; String tairUser = "r-"; String tairPassword = ""; JedisPool pool; if ("redis".equals(args[0])) { System.out.println("redis"); pool = new JedisPool(config, redisHost, 6379, redisUser, redisPassword); } else { System.out.println("tair"); pool = new JedisPool(config, tairHost, 6379, tairUser, tairPassword); } String filePath = "local".equals(args[1]) ? "/Users/Downloads/weibo_train_data.txt" : "/home/weibo_train_data.txt"; System.out.println(filePath); readTxtFile(filePath, pool); } }
复制代码

六:模拟数据

1229619 条微博用户发帖数据


写入性能截图

Redis



Tair



服务器负载



从图里看,在没有调整任何参数的情况下,插入 250w 条数据,Redis 和 Tair 基本没有太大的区别,只是 Tair 的平均时延有些高,两者的 QPS 都能达到 1000,还没有跑满官方的参考值。

读取测试截图

代码


public static void getTxtFile(String filePath, JedisPool pool) {    try {        File file = new File(filePath);        if (file.isFile() && file.exists()) {            InputStreamReader isr = new InputStreamReader(Files.newInputStream(file.toPath()), StandardCharsets.UTF_8);            BufferedReader br = new BufferedReader(isr);            String lineTxt = null;            AtomicInteger i = new AtomicInteger();            ExecutorService executorService = new ThreadPoolExecutor(50, 50, 100L, TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>(), new ThreadPoolExecutor.CallerRunsPolicy());
while ((lineTxt = br.readLine()) != null) { String[] textArr = lineTxt.split("\t"); if (textArr.length <= 6) { continue; } executorService.submit(() -> { try (Jedis jedis = pool.getResource()) { System.out.println(jedis.get(textArr[0] + "-" + i.getAndIncrement())); } }); executorService.submit(() -> { try (Jedis jedis = pool.getResource()) { System.out.println(jedis.get(textArr[1] + "-" + i.getAndIncrement())); } }); } System.out.println("处理完毕,共处理:" + i); executorService.shutdown(); br.close(); } else { System.out.println("文件不存在!"); } } catch (Exception e) { System.out.println("文件读取错误!" + e); }}
复制代码

Redis

Tair


总结

通过监控报表的分析,主要的差距还是在平均时延上,在并发 50 情况下,QPS 达到 1000 左右时,redis 的平均时延要比 Tair 低很多,写入和读取时延都有所差距。其他的两者完全相似。



https://developer.aliyun.com/trainingcamp/5fd706c381604c09bebaf774a6290c5a?spm=a2c6h.12883283.0.0.5f1f4307Aqn8to#free


用户头像

AlgoRain

关注

还未添加个人签名 2020-04-06 加入

还未添加个人简介

评论

发布
暂无评论
阿里云Redis与Tair压力测评_AlgoRain_InfoQ写作社区