
# 使用redis-benchmark测试Redis性能
Redis客户端源码包含一个名为redis-benchmark的性能测试工具，它可以模拟N个客户端同时向Redis发送M条查询命令的应用场景。
针对DCS Redis实例的性能评估，可以使用redis-benchmark测试某种规格的实例在某个高并发场景下执行SET或GET时的性能。
#### 测试步骤
1. 创建Redis缓存实例。
2. 创建3台弹性云服务器（ECS），ECS选择与实例相同可用区、VPC、子网和安全组。 
   ![](https://support.huaweicloud.com/usermanual-dcs/public_sys-resources/note_3.0-zh-cn.png)
   如果是测试单机或主备实例，创建1台ECS即可。
   
   
3. 在每台ECS上安装redis-benchmark。可通过以下两种方式安装Redis-server，安装Redis-server的同时，会同步安装benchmark。 
   - 安装方法一：
     1. 下载redis客户端，此处以redis-7.2.0版本为例。 **wget http://download.redis.io/releases/redis-7.2.0.tar.gz**
        
     
     2. 解压客户端压缩包。 **tar xzf redis-7.2.0.tar.gz**
        
     
     3. 进入redis-7.2.0的src目录下。 **cd redis-7.2.0/src**
        
     
     4. 编译源码。 **make**
        编译完成后，工具一般在redis-x.x.x的src目录下。
        
     
     5. 查看是否有redis-benchmark可执行文件。 **ls**
        ![](https://support.huaweicloud.com/usermanual-dcs/zh-cn_image_0000001989929609.png "点击放大")
        
     
     6. 将工具安装到系统中。 **make install**
        
      
   
   - 安装方法二： 根据ECS的不同的操作系统直接安装Redis-server，下面以ubuntu和CentOS系统为例：
     - ubuntu系统
       ```
       sudo apt update 
       sudo apt install redis-server
       ```
       
     
     - CentOS系统
       ```
       sudo yum install epel-release 
       sudo yum update 
       sudo yum -y install redis
       ```
       
     
     
     
     
   
   
   
   
4. 每台ECS上执行测试命令。
   
   ```
   redis-benchmark -h {IP} -p {Port} -a {password} -n {nreqs} -r {randomkeys} -c {connect_number} -d {datasize} -t {command}
   ```
   参数参考值：-c {connect_number}：200，-n {nreqs}：10000000，-r {randomkeys}：1000000，-d {datasize}：32。
   - -h表示实例的域名连接地址或IP地址。
   
   - -p表示实例的端口，默认为6379。
   
   - -a表示实例的连接密码，免密连接的实例无需输入-a {password}。
   
   - -t表示执行具体测试命令合集。例如只测试set命令时，使用-t set；如果要测试ping、get、set命令，则使用 -t ping,set,get，命令间使用","分隔。
   
   - -c表示客户端连接数。
   
   - -d表示单条数据大小，单位Byte。
   
   - -n表示测试包数量。
   
   - -r表示使用随机key数量。
   
   
   
   
5. 不断调整客户端连接数，执行[4]，得到最大的QPS（Query Per Second，表示每秒处理的读写操作数，单位：次/秒）。
6. 取3台测试ECS得到的每秒操作数总和，即为对应规格的性能数据。 
   如果测试Redis集群，建议每台测试ECS各开启两个benchmark客户端。
   ![](https://support.huaweicloud.com/usermanual-dcs/public_sys-resources/note_3.0-zh-cn.png)
   - redis-benchmark 测试cluster集群实例时需要加 --cluster 参数，其他实例类型不需要加。
   
   - 如果想对cluster集群的最大连接数进行性能压测，但是压测到1万连接时程序退出，或者报错 Cannot assign requested address。这说明是测试用的ECS本机性能不足，请先检查自己是否只用了1台ECS进行压测。想要对集群压测，建议准备3台ECS，每台ECS起3个redis-benchmark来测试redis实例的最大连接数。
    
   
   
 
#### redis-cli常用选项
- -h \<hostname\> ：服务器的主机名，可以是IP或者域名
- -p \<port\> ：服务器的端口，默认是6379
- -a \<password\> ：连接服务器的密码，免密连接的实例无需输入-a {password}
- -r \<repeat\> ：执行指定命令N次
- -n \<db\> ：数据库编号，默认是0
- -c ：启用集群模式（遵循-ASK和-MOVED重定向）
- --latency ：进入特殊模式连续采样延迟
- --scan ：非阻塞式的扫描键空间（区别于keys \*扫描键空间会导致redis-server阻塞）
- --eval \<file\> ：使用Lua脚本发送EVAL命令
- -x ：读取STDIN中的最后一个参数
- --bigscan ：扫描数据集的大key
- --raw ： 如果显示数据是这样的'\\xe4\\xb8'十六进制编码，可以尝试加--raw转为直接显示原始数据
 
#### redis-cli常用命令举例
- 连接实例： **./redis-cli -h {IP} -p 6379**
  
- 指定连接某个DB： **./redis-cli -h {IP} -p 6379 -n 10**
  
- 连接cluster集群实例： **./redis-cli -h {IP} -p 6379 -c**
  
- 测试时延（原理是发ping命令）： **./redis-cli -h {IP} -p 6379 --latency**
  
- 执行scan扫描匹配指定模式的key： **./redis-cli -h {IP} -p 6379 --scan --pattern '\*:12345\*'**
  
 
#### redis-benchmark (redis-7.2.0)常用选项
- -h \<hostname\> ：服务器的主机名，可以是IP或者域名。
- -p \<port\> ：服务器的端口，默认是6379。
- -a \<password\> ：连接服务器的密码，免密连接的实例无需输入-a {password}。
- -c \<clients\> ：并发连接数 ，默认50。
- -n \<requests\> ：请求总数（默认为100000）。
- -d \<size\> ：SET/GET值的数据大小（以字节为单位，默认值2）。
- --dbnum \<db\> ：选择指定的数据库编号（默认值0）。
- --threads \<num\> ：启动多线程模式（redis 6.0版本编译的redis-benchmark才支持，多线程压测redis的性能优于单线程）。
- --cluster ：启动集群模式（cluster集群才需要该参数）。
- -k \<boolean\> ：1=keep alive 0=reconnect（默认值1，可以测试长短连接）。
- -r \<keyspacelen\> ： 对SET/GET/INCR使用随机键，对SADD使用随机值。参数中keyspacelen 指的是添加键的数量。
- -e ：如果服务器回复错误，请在stdout上显示它们。
- -q ：只展示query/sec的值。
- -l ：循环测试。
- -t \<tests\> ：可以对指定的命令进行测试。
- -I ：空闲模式，仅打开N个空闲连接并等待。
- -P \<numreq\> ：管道请求的并发数量（默认值为1）。
了解redis-benchmark更多详情，请访问：<https://redis.io/docs/latest/operate/oss_and_stack/management/optimization/benchmarks/>
#### redis-benchmark常用命令举例
- 单机、主备、读写分离和proxy集群的测试命令： **./redis-benchmark -h {IP或域名} -p 6379 -a {password} --threads {num} -n { nreqs } -r { randomkeys } -c {clients} -d {datasize} -t {command}**
  
- cluster集群测试命令： **./redis-benchmark -h {IP或域名} -p 6379 -a {password} --threads {num} -n { nreqs } -r { randomkeys } -c {clients} -d {datasize} --cluster -t {command}**
  
- 测试短连接： **./redis-benchmark -h {IP或域名} -p 6379 -a {password} --threads {num} -n { nreqs } -r { randomkeys } -c {clients} -d {datasize} -k 0 -t {command}**
  
- 测试空闲连接： **./redis-benchmark -h {IP或域名} -p 6379 -a {pwd} -c {clients} -I**
  
 
