阿里云Redis与Tair压力测评

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 无意中发现阿里云开发社区的训练营活动,其中有一个7天玩转Redis、tair训练营计划,里面可以免费领取三个月的试用礼包,因为是参营任务,不领取都不行的那种,领取之后放着也是放着,不如跑跑数据看看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,不过数据传输速率也是可靠的。

Redis

Tair

ECS服务器1

ECS服务器1

规格

2 GB 增强版 (vCPU shared)

2 GB 增强版 (vCPU shared)

4C8G

4C8G

最大连接数

10,000

30,000

最大带宽

96 MB/s

96 MB/s

参考QPS

100,000

300,000

副本数

2副本

2副本

分片数量

1

1

Redis版本

Redis 5.0

版本兼容性:Redis 6.0

存储空间

10G

10G

架构类型

非集群

非集群

maxmemory-policy

volatile-lru (按照LRU算法逐出原有数据,但仅逐出设置了过期时间的数据)

volatile-lru (按照LRU算法逐出原有数据,但仅逐出设置了过期时间的数据)

五:运行代码:

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(), 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(), 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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
NoSQL Cloud Native Linux
通过 RIOT 将 AWS ElastiCache 迁移到阿里云 Tair
通过 RIOT 将 AWS ElastiCache 迁移到阿里云 Tair
|
1月前
|
监控 NoSQL Redis
开发者如何使用阿里云Redis
【10月更文挑战第2天】开发者如何使用阿里云Redis
223 0
|
2月前
|
NoSQL 安全 容灾
阿里云DTS踩坑经验分享系列|Redis迁移、同步
阿里云数据传输服务DTS在帮助用户迁移Redis数据、同步数据时,在某些复杂场景下会出现报错,或者源库与目标库数据不一致的问题,给用户带来困扰。本文介绍了DTS Redis到Redis迁移、同步过程中的典型问题,以帮助用户更好地使用DTS。
198 2
|
3月前
|
存储 NoSQL Redis
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
|
4月前
|
NoSQL Cloud Native Redis
|
5月前
|
NoSQL 安全 Redis
阿里云redis安装
阿里云redis安装
136 0
|
6月前
|
存储 Dragonfly NoSQL
Tair 对 Redis 引擎架构之争的看法
本文详细讲解了阿里云自研数据库Tair的发展以及介绍。
73632 1
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
74 6
|
6天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题