阿里云Redis与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月前
|
人工智能 监控 Cloud Native
iLogtail 2.0 来了;通义灵码下载量破百万丨阿里云云原生 2 月产品月报
iLogtail 2.0 来了;通义灵码下载量破百万丨阿里云云原生 2 月产品月报
|
1月前
|
存储 弹性计算 数据挖掘
阿里云4核8G云服务器价格多少钱?2024年阿里云4核8G云服务器价格及性能测评参考
2024年,阿里云针对4核8G配置的云服务器提供了多种实例规格,包括经济型e实例、通用算力型u1、计算型c7等。这些不同实例规格的服务器在性能参数和费用上都有所不同,以满足不同用户的需求。其中,通用算力型u1实例的4核8G云服务器在价格上表现出色。新用户专享活动价仅需955.58元一年,折合每月仅需80元。这一价格相较于同类产品来说,性价比极高。同时,该服务器配备了高性能的ESSD云盘,能够确保用户在存储操作系统、应用程序和数据时获得最佳体验。
131 0
|
5天前
|
Cloud Native Serverless 开发者
阿里云助力开发者创新:探索云原生技术的新境界
阿里云开发者社区推动云原生技术发展,提供丰富产品(如容器服务、Serverless、微服务架构、服务网格)与学习平台,助力企业数字化转型。开发者在此探索实践,共享资源,参与技术活动,共同创新,共创云原生技术新篇章。一起加入,开启精彩旅程!
83 2
|
1月前
|
弹性计算
阿里云3M带宽云服务器并发多大?阿里云3M带宽云服务器测评参考
在探讨云服务器3M带宽能支持多大并发这一问题时,我们首先要明白一个关键点:并发量并非仅由带宽决定,还与网站本身的大小密切相关。一般来说,一个优化良好的普通网站页面大小可能只有几K,为便于计算,我们可以暂且假定每个页面大小为50K。
824 1
|
1月前
|
弹性计算 NoSQL Redis
阿里云ECS使用docke搭建redis服务
阿里云ECS使用docke搭建redis服务
157 1
|
19天前
|
消息中间件 人工智能 监控
|
27天前
|
消息中间件 NoSQL Kafka
云原生最佳实践系列 5:基于函数计算 FC 实现阿里云 Kafka 消息内容控制 MongoDB DML 操作
该方案描述了一个大数据ETL流程,其中阿里云Kafka消息根据内容触发函数计算(FC)函数,执行针对MongoDB的增、删、改操作。
|
1月前
|
弹性计算 小程序 开发者
阿里云服务器性能测评:25M带宽阿里云云服务器支持多少人访问?
在深入探讨25M带宽云服务器的性能时,我们首先要明确一个核心概念:带宽与服务器能够支持的同时访问量之间存在着直接的关联。那么,大家可能会好奇,带宽为25M的云服务器究竟能够支持多少用户同时访问呢?
130 0
|
1月前
|
存储 弹性计算 云计算
9M带宽的阿里云服务器支持多少用户并发访问?阿里云9M带宽服务器测评
随着云计算技术的飞速进步与日益完善,云服务器已经逐渐成为了众多企业与个人的首选服务器类型。它以其出色的弹性扩展、高可用性以及灵活的管理方式,赢得了广大用户的青睐。那么,对于一款拥有9M带宽的云服务器来说,到了2024年,它究竟能够支持多少用户进行并发访问呢?这无疑是许多准备使用云服务的用户非常关心的问题。
146 0
|
1月前
|
弹性计算 NoSQL 测试技术
倚天使用|Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
137511 5