前言
Redis 是一个NOSQL内存数据库, 将数据保存在内存中效率比保存在磁盘上的数据库要快很多,单机Redis QPS基本上能达到10w, 但是当Redis发生延迟时,我们要怎么去排查呢? 本文主要介绍一下Redis命令的执行过程和一些性能测试工具命令分析
1. Redis命令的执行过程
1.1 命令执行的三个阶段
一条命令执行可以分为三个阶段
- 建立链接阶段, 响应了socket的建立,并且创建了client对象;
- 处理阶段, 从socket读取数据到输入缓冲区,然后解析并获得命令,执行命令并将返回值存储到输出缓冲区中
- 数据返回阶段, 将返回值从输出缓冲区写到socket中,返回给客户端,最后关闭client。
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也给了几个测试的案例
[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