Redis 性能分析

868 阅读3分钟

前言

Redis 是一个NOSQL内存数据库, 将数据保存在内存中效率比保存在磁盘上的数据库要快很多,单机Redis QPS基本上能达到10w, 但是当Redis发生延迟时,我们要怎么去排查呢? 本文主要介绍一下Redis命令的执行过程和一些性能测试工具命令分析

Redis性能分析.png

1. Redis命令的执行过程

1.1 命令执行的三个阶段

一条命令执行可以分为三个阶段

  1. 建立链接阶段, 响应了socket的建立,并且创建了client对象;
  2. 处理阶段, 从socket读取数据到输入缓冲区,然后解析并获得命令,执行命令并将返回值存储到输出缓冲区中
  3. 数据返回阶段, 将返回值从输出缓冲区写到socket中,返回给客户端,最后关闭client。

image.png

1.2 原理分析

1.2.1 启动时监听socket

1.2.2 建立连接和Client

1.2.3 读取socket数据到输入缓冲区

1.2.4 解析获取命令

1.2.5 执行命令

2. Redis 性能测试

Redis-benchmark是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能。工具Help也给了几个测试的案例

image.png

[root@VM_0_14_centos bin]# redis-benchmark -h 127.0.0.1 -p 6379 -c 1 -n 100000 -d 100
====== PING_INLINE ======
  100000 requests completed in 2.30 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

100.00% <= 1 milliseconds
100.00% <= 6 milliseconds
43402.78 requests per second

====== PING_BULK ======
  100000 requests completed in 2.22 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

100.00% <= 1 milliseconds
100.00% <= 1 milliseconds
45065.34 requests per second

====== SET ======
  100000 requests completed in 2.25 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

100.00% <= 1 milliseconds
100.00% <= 2 milliseconds
44464.20 requests per second

====== GET ======
  100000 requests completed in 2.20 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

100.00% <= 1 milliseconds
100.00% <= 6 milliseconds
45537.34 requests per second

====== INCR ======
  100000 requests completed in 2.21 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

100.00% <= 1 milliseconds
100.00% <= 2 milliseconds
100.00% <= 6 milliseconds
45310.38 requests per second

====== LPUSH ======
  100000 requests completed in 2.26 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

100.00% <= 1 milliseconds
100.00% <= 2 milliseconds
44208.66 requests per second

====== RPUSH ======
  100000 requests completed in 2.26 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

100.00% <= 1 milliseconds
100.00% <= 6 milliseconds
44189.13 requests per second

====== LPOP ======
  100000 requests completed in 2.24 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

99.99% <= 1 milliseconds
100.00% <= 2 milliseconds
100.00% <= 6 milliseconds
100.00% <= 7 milliseconds
100.00% <= 7 milliseconds
44722.72 requests per second

====== RPOP ======
  100000 requests completed in 2.21 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

100.00% <= 1 milliseconds
100.00% <= 3 milliseconds
45187.53 requests per second

====== SADD ======
  100000 requests completed in 2.26 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

100.00% <= 1 milliseconds
100.00% <= 2 milliseconds
44306.60 requests per second

====== HSET ======
  100000 requests completed in 2.30 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

100.00% <= 1 milliseconds
100.00% <= 6 milliseconds
43440.48 requests per second

====== SPOP ======
  100000 requests completed in 2.21 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

100.00% <= 1 milliseconds
100.00% <= 2 milliseconds
45207.96 requests per second

====== LPUSH (needed to benchmark LRANGE) ======
  100000 requests completed in 2.28 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
43936.73 requests per second

====== LRANGE_100 (first 100 elements) ======
  100000 requests completed in 2.25 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

100.00% <= 1 milliseconds
100.00% <= 2 milliseconds
100.00% <= 6 milliseconds
44483.99 requests per second

====== LRANGE_300 (first 300 elements) ======
  100000 requests completed in 2.25 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

100.00% <= 5 milliseconds
44523.60 requests per second

====== LRANGE_500 (first 450 elements) ======
  100000 requests completed in 2.23 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

100.00% <= 1 milliseconds
44782.80 requests per second

====== LRANGE_600 (first 600 elements) ======
  100000 requests completed in 2.26 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

100.00% <= 1 milliseconds
100.00% <= 2 milliseconds
100.00% <= 6 milliseconds
100.00% <= 6 milliseconds
44286.98 requests per second

====== MSET (10 keys) ======
  100000 requests completed in 2.53 seconds
  1 parallel clients
  100 bytes payload
  keep alive: 1

100.00% <= 1 milliseconds
100.00% <= 2 milliseconds
100.00% <= 6 milliseconds
39510.08 requests per second

3. 其他影响性能因素

参考

redis.io/topics/late…