1.环境说明
使用的是腾讯的云服务器1核心2G内存50G存储
的乞丐版,系统信息如下:
[root@tcloud ~]# rpm -qi centos-release Name : centos-release Version : 7 Release : 9.2009.1.el7.centos Architecture: x86_64 Install Date: Tue 19 Jan 2021 06:23:16 PM CST Group : System Environment/Base Size : 44787 License : GPLv2 Signature : RSA/SHA256, Thu 03 Dec 2020 12:35:28 AM CST, Key ID 24c6a8a7f4a80eb5 Source RPM : centos-release-7-9.2009.1.el7.centos.src.rpm Build Date : Mon 23 Nov 2020 11:08:41 PM CST Build Host : x86-01.bsys.centos.org Relocations : (not relocatable) Packager : CentOS BuildSystem <http://bugs.centos.org> Vendor : CentOS Summary : CentOS Linux release file Description : CentOS Linux release files
全部版本下载地址https://download.redis.io/releases/,Redis安装配置:
# 0.卸载 rm -rf /usr/local/redis # 1.安装依赖否则报错【/bin/sh: cc: 未找到命令】 yum install gcc-c++ -y # 2.解压文件 tar -zvxf redis-{版本号}.tar.gz # 3.移动文件 mv ./redis-{版本号} /usr/local/redis-{版本号} # 4.编译 cd /usr/local/redis-{版本号}/ make # 5.安装 make PREFIX=/usr/local/redis-{版本号} install # 如不添加PREFIX指定安装文件夹Linux会将可执行文件存放在/usr/local/bin、库文件会存放在/usr/local/lib、配置文件会存放在/usr/local/etc,其他的资源文件会存放在usr/local/share目录,不便于清理,指定安装文件夹后,使用 rm -rf /usr/local/redis 即可清除 Redis。 # 6.配置【保持默认】 vim /usr/local/redis-{版本号}/redis.conf # 后台启动 daemonize yes # 7.启动 ./bin/redis-server ./redis.conf
# 测试使用默认分配器。 # redis内存管理方式:支持tcmalloc、jemalloc、malloc三种内存分配。 # 可使用 info Memory 命令查询碎片信息。 make MALLOC=jemalloc # MALLOC 选项是用于指定使用的内存分配库。该选项可以指定链接器使用指定的内存分配库,从而将程序编译成使用指定库的可执行文件。 # MALLOC=jemalloc 指定链接器使用 jemalloc 库中的 malloc 函数来代替标准的 malloc 函数,以获得更好的性能。这对于一些需要更高内存效率和更低内存碎片的应用程序非常有用,已内置是Redis的默认选项。 # MALLOC=tcmalloc 指定链接器使用 tcmalloc 库中的 malloc 函数来代替标准的 malloc 函数,使用时需要安装。 # MALLOC=libc 指定链接器使用 GNU C 库中包含的 malloc 函数作为程序的默认内存分配函数,使用时需要安装。
为控制尽可能的控制变量,不同版本的Redis测试前重启服务器,测试命令为:
# 1.查看内存分配器的版本 info memory # 2.延迟测试 ./bin/redis-cli --intrinsic-latency 10 # 表示到目前为止最慢的一次运行的延迟是6890微秒。 Max latency so far: 6890 microseconds. # 表示总共运行了151480390次,平均延迟为0.0660微秒/每次,即66.02纳秒/每次。 151480390 total runs (avg latency: 0.0660 microseconds / 66.02 nanoseconds per run). # 表示最慢的一次运行比平均延迟慢了104370倍。 Worst run took 104370x longer than the average latency. # 3.性能测试【测试三轮使用平均值】 ./bin/redis-benchmark -q
2.测试结果
- 关于结果中的 PING_MBULK 和 PING_BULK
在 Redis 中,PING_MBULK 和 PING_BULK 都是用来测试与 Redis 服务器之间的连接是否正常的命令。但是,它们使用的协议和返回结果格式略有不同。
PING_MBULK 命令使用多个参数的批量请求(multi-bulk request)协议,它将一个字符串数组作为参数发送到 Redis 服务器,服务器返回对应的字符串数组作为响应。如果服务器正常运行,它将返回 “PONG” 字符串作为响应,而且需要注意的是,这个字符串响应可能包含在数组中。因此,PING_MBULK 请求发送到 Redis 服务器时,它的第一个参数应该是数组的长度,后面跟随着每个参数。例如,PING_MBULK 2 hello world 命令将发送一个长度为 2 的数组,包含字符串 “hello” 和 “world” 作为参数,并返回一个长度为 2 的数组,包含响应字符串 “PONG”。
PING_BULK 命令使用单个参数的批量请求(bulk request)协议,它将一个字符串作为参数发送到 Redis 服务器,服务器也将返回对应的字符串作为响应。PING_BULK 命令和 PING_MBULK 命令的唯一区别是参数格式的不同。PING_BULK 命令只需要一个字符串参数,例如 PING_BULK hello 命令将发送字符串 “hello” 作为参数,并且返回相同的字符串 “hello” 作为响应。
因此,虽然 PING_MBULK 和 PING_BULK 命令都可以用来测试连接是否正常,但是它们使用的协议和返回结果格式是不同的。如果你希望发送多个参数,可以使用 PING_MBULK 命令;如果你只需要一个参数,则可以使用 PING_BULK 命令。
我们暂且将其当作相同的。
- 关于性能测试结果数据
性能测试结果为了简洁清晰,去掉了单位requests per second
和6.x\7.x的p50=xxxx msec
。
- 图表说明
柱状图为了展示稳定性,折线图为了比对性能。
Version 5.0.3【待优化版本】
- 内存分配器版本 mem_allocator:jemalloc-5.1.0
- 延迟测试结果
# 1 150584708 total runs (avg latency: 0.0664 microseconds / 66.41 nanoseconds per run). Worst run took 93393x longer than the average latency. # 2 151425412 total runs (avg latency: 0.0660 microseconds / 66.04 nanoseconds per run). Worst run took 121928x longer than the average latency. # 3 151173847 total runs (avg latency: 0.0661 microseconds / 66.15 nanoseconds per run). Worst run took 121453x longer than the average latency.
- 性能测试结果
# 1 PING_INLINE: 63734.86 PING_BULK: 64641.24 SET: 63451.78 GET: 62421.97 INCR: 60496.07 LPUSH: 59916.12 RPUSH: 63051.70 LPOP: 62500.00 RPOP: 62227.75 SADD: 63532.40 HSET: 60938.45 SPOP: 64184.86 LPUSH (needed to benchmark LRANGE): 62111.80 LRANGE_100 (first 100 elements): 34590.11 LRANGE_300 (first 300 elements): 15938.79 LRANGE_500 (first 450 elements): 11619.80 LRANGE_600 (first 600 elements): 9228.50 MSET (10 keys): 54288.82 # 2 PING_INLINE: 63897.76 PING_BULK: 63613.23 SET: 60938.45 GET: 61500.61 INCR: 63734.86 LPUSH: 60459.49 RPUSH: 62695.92 LPOP: 60459.49 RPOP: 60642.81 SADD: 63211.12 HSET: 62500.00 SPOP: 64391.50 LPUSH (needed to benchmark LRANGE): 61842.92 LRANGE_100 (first 100 elements): 33692.72 LRANGE_300 (first 300 elements): 16147.26 LRANGE_500 (first 450 elements): 11687.71 LRANGE_600 (first 600 elements): 9188.64 MSET (10 keys): 54914.88 # 3 PING_INLINE: 61690.31 PING_BULK: 65316.79 SET: 62460.96 GET: 64474.53 INCR: 63938.62 LPUSH: 62266.50 RPUSH: 60569.35 LPOP: 59952.04 RPOP: 62853.55 SADD: 63011.97 HSET: 62853.55 SPOP: 63451.78 LPUSH (needed to benchmark LRANGE): 60459.49 LRANGE_100 (first 100 elements): 34602.07 LRANGE_300 (first 300 elements): 16155.09 LRANGE_500 (first 450 elements): 11665.89 LRANGE_600 (first 600 elements): 9236.17 MSET (10 keys): 53447.35
Version 5.0.7【云服务器使用的版本】
- 内存分配器版本 mem_allocator:jemalloc-5.1.0
- 延迟测试结果
# 1 150104030 total runs (avg latency: 0.0666 microseconds / 66.62 nanoseconds per run). Worst run took 103602x longer than the average latency. # 2 150460074 total runs (avg latency: 0.0665 microseconds / 66.46 nanoseconds per run). Worst run took 159969x longer than the average latency. # 3 149924658 total runs (avg latency: 0.0667 microseconds / 66.70 nanoseconds per run). Worst run took 236686x longer than the average latency.
- 性能测试结果
# 1 PING_INLINE: 61349.70 PING_BULK: 62656.64 SET: 61881.19 GET: 63091.48 INCR: 62150.41 LPUSH: 61199.51 RPUSH: 60132.29 LPOP: 60422.96 RPOP: 59523.81 SADD: 63331.22 HSET: 61614.29 SPOP: 64143.68 LPUSH (needed to benchmark LRANGE): 57603.69 LRANGE_100 (first 100 elements): 33658.70 LRANGE_300 (first 300 elements): 16350.56 LRANGE_500 (first 450 elements): 11745.36 LRANGE_600 (first 600 elements): 9299.73 MSET (10 keys): 52603.89 # 2 PING_INLINE: 62735.26 PING_BULK: 63091.48 SET: 61728.39 GET: 63371.36 INCR: 62893.08 LPUSH: 59701.50 RPUSH: 61050.06 LPOP: 61387.36 RPOP: 61804.70 SADD: 62421.97 HSET: 61387.36 SPOP: 61199.51 LPUSH (needed to benchmark LRANGE): 60496.07 LRANGE_100 (first 100 elements): 34376.07 LRANGE_300 (first 300 elements): 16144.66 LRANGE_500 (first 450 elements): 11893.43 LRANGE_600 (first 600 elements): 9187.80 MSET (10 keys): 51813.47 # 3 PING_INLINE: 60277.27 PING_BULK: 61199.51 SET: 62853.55 GET: 63492.06 INCR: 63131.31 LPUSH: 60827.25 RPUSH: 60679.61 LPOP: 61425.06 RPOP: 62539.09 SADD: 63331.22 HSET: 61766.52 SPOP: 64143.68 LPUSH (needed to benchmark LRANGE): 60716.46 LRANGE_100 (first 100 elements): 34387.89 LRANGE_300 (first 300 elements): 16441.96 LRANGE_500 (first 450 elements): 11851.15 LRANGE_600 (first 600 elements): 9350.16 MSET (10 keys): 53475.94
Version 5.0.14【5.x最终版】
- 内存分配器版本 mem_allocator:jemalloc-5.1.0
- 延迟测试结果
# 1 151427848 total runs (avg latency: 0.0660 microseconds / 66.04 nanoseconds per run). Worst run took 86041x longer than the average latency. # 2 151490061 total runs (avg latency: 0.0660 microseconds / 66.01 nanoseconds per run). Worst run took 98196x longer than the average latency. # 3 145840102 total runs (avg latency: 0.0686 microseconds / 68.57 nanoseconds per run). Worst run took 349797x longer than the average latency.
- 性能测试结果
# 1 PING_INLINE: 60901.34 PING_BULK: 62227.75 SET: 63011.97 GET: 63572.79 INCR: 64102.57 LPUSH: 60240.96 RPUSH: 61387.36 LPOP: 61690.31 RPOP: 63211.12 SADD: 63775.51 HSET: 61804.70 SPOP: 64599.48 LPUSH (needed to benchmark LRANGE): 60024.01 LRANGE_100 (first 100 elements): 34818.94 LRANGE_300 (first 300 elements): 16423.06 LRANGE_500 (first 450 elements): 11877.90 LRANGE_600 (first 600 elements): 9272.14 MSET (10 keys): 52164.84 # 2 PING_INLINE: 63131.31 PING_BULK: 63897.76 SET: 61728.39 GET: 63331.22 INCR: 64061.50 LPUSH: 62344.14 RPUSH: 62617.41 LPOP: 62656.64 RPOP: 62735.26 SADD: 61425.06 HSET: 62972.29 SPOP: 64935.07 LPUSH (needed to benchmark LRANGE): 62500.00 LRANGE_100 (first 100 elements): 35273.37 LRANGE_300 (first 300 elements): 16134.24 LRANGE_500 (first 450 elements): 11917.53 LRANGE_600 (first 600 elements): 9272.14 MSET (10 keys): 54644.81 # 3 PING_INLINE: 61500.61 PING_BULK: 64143.68 SET: 63131.31 GET: 63979.53 INCR: 63451.78 LPUSH: 62150.41 RPUSH: 61652.28 LPOP: 60350.03 RPOP: 63051.70 SADD: 63816.21 HSET: 61842.92 SPOP: 64599.48 LPUSH (needed to benchmark LRANGE): 61804.70 LRANGE_100 (first 100 elements): 33967.39 LRANGE_300 (first 300 elements): 16315.88 LRANGE_500 (first 450 elements): 11687.71 LRANGE_600 (first 600 elements): 9197.09 MSET (10 keys): 53966.54
Version 6.2.12【6.x最终版】
- 内存分配器版本 mem_allocator:jemalloc-5.1.0
- 延迟测试结果
# 1 150688768 total runs (avg latency: 0.0664 microseconds / 66.36 nanoseconds per run). Worst run took 108059x longer than the average latency. # 2 150739896 total runs (avg latency: 0.0663 microseconds / 66.34 nanoseconds per run). Worst run took 94966x longer than the average latency. # 3 151686617 total runs (avg latency: 0.0659 microseconds / 65.93 nanoseconds per run). Worst run took 88433x longer than the average latency.
- 性能测试结果【比5.x的多了ZADD、ZPOPMIN,汇总时不比对这几项】
# 1 PING_INLINE: 62617.41 PING_MBULK: 63816.21 SET: 60496.07 GET: 63051.70 INCR: 63291.14 LPUSH: 60975.61 RPUSH: 61957.87 LPOP: 60532.69 RPOP: 60024.01 SADD: 63451.78 HSET: 61804.70 SPOP: 63371.36 ZADD: 61312.08 ZPOPMIN: 63251.11 LPUSH (needed to benchmark LRANGE): 59701.50 LRANGE_100 (first 100 elements): 34199.73 LRANGE_300 (first 300 elements): 15989.77 LRANGE_500 (first 500 elements): 10660.98 LRANGE_600 (first 600 elements): 9031.79 MSET (10 keys): 51759.83 # 2 PING_INLINE: 61312.08 PING_MBULK: 63694.27 SET: 61124.69 GET: 60679.61 INCR: 62774.64 LPUSH: 61050.06 RPUSH: 60496.07 LPOP: 60975.61 RPOP: 62227.75 SADD: 63171.20 HSET: 61804.70 SPOP: 63979.53 ZADD: 57736.72 ZPOPMIN: 62972.29 LPUSH (needed to benchmark LRANGE): 60096.15 LRANGE_100 (first 100 elements): 34013.61 LRANGE_300 (first 300 elements): 15676.44 LRANGE_500 (first 500 elements): 10571.94 LRANGE_600 (first 600 elements): 9108.30 MSET (10 keys): 54288.82 # 3 PING_INLINE: 62695.92 PING_MBULK: 61199.51 SET: 62111.80 GET: 63131.31 INCR: 63532.40 LPUSH: 60864.27 RPUSH: 61804.70 LPOP: 59880.24 RPOP: 60422.96 SADD: 62972.29 HSET: 62227.75 SPOP: 63211.12 ZADD: 61500.61 ZPOPMIN: 63051.70 LPUSH (needed to benchmark LRANGE): 58651.02 LRANGE_100 (first 100 elements): 33355.57 LRANGE_300 (first 300 elements): 15770.38 LRANGE_500 (first 500 elements): 10511.93 LRANGE_600 (first 600 elements): 9005.76 MSET (10 keys): 53937.43
Version 7.2-rc1【当前最新的发布候选版】
使用redis-cli -v
实际显示的版本为redis-cli 7.1.240
- 内存分配器版本 mem_allocator:jemalloc-5.2.1【有所升级】
- 延迟测试结果
# 1 145147429 total runs (avg latency: 0.0689 microseconds / 68.90 nanoseconds per run). Worst run took 110893x longer than the average latency. # 2 144972616 total runs (avg latency: 0.0690 microseconds / 68.98 nanoseconds per run). Worst run took 142175x longer than the average latency. # 3 143717969 total runs (avg latency: 0.0696 microseconds / 69.58 nanoseconds per run). Worst run took 323797x longer than the average latency.
- 性能测试结果【比5.x的多了ZADD、ZPOPMIN、XADD,汇总时不比对这几项】
# 1 PING_INLINE: 59276.82 PING_MBULK: 60642.81 SET: 56657.22 GET: 57537.40 INCR: 56593.10 LPUSH: 56721.50 RPUSH: 57142.86 LPOP: 55524.71 RPOP: 57045.07 SADD: 57770.08 HSET: 55096.42 SPOP: 59453.03 ZADD: 57110.22 ZPOPMIN: 58788.95 LPUSH (needed to benchmark LRANGE): 56850.48 LRANGE_100 (first 100 elements): 24863.25 LRANGE_300 (first 300 elements): 10794.47 LRANGE_500 (first 500 elements): 7001.82 LRANGE_600 (first 600 elements): 5853.09 MSET (10 keys): 42716.79 XADD: 51652.89 # 2 PING_INLINE: 59311.98 PING_MBULK: 60864.27 SET: 54945.05 GET: 58309.04 INCR: 59066.75 LPUSH: 56689.34 RPUSH: 55679.29 LPOP: 56433.41 RPOP: 54674.69 SADD: 56401.58 HSET: 56915.20 SPOP: 59136.61 ZADD: 55096.42 ZPOPMIN: 57803.47 LPUSH (needed to benchmark LRANGE): 54975.26 LRANGE_100 (first 100 elements): 25207.96 LRANGE_300 (first 300 elements): 10735.37 LRANGE_500 (first 500 elements): 7007.71 LRANGE_600 (first 600 elements): 5928.03 MSET (10 keys): 42301.18 XADD: 49504.95 # 3 PING_INLINE: 59311.98 PING_MBULK: 58479.53 SET: 56053.81 GET: 58479.53 INCR: 58105.75 LPUSH: 56465.27 RPUSH: 57339.45 LPOP: 56053.81 RPOP: 54674.69 SADD: 58479.53 HSET: 57045.07 SPOP: 58616.65 ZADD: 57045.07 ZPOPMIN: 58004.64 LPUSH (needed to benchmark LRANGE): 55710.31 LRANGE_100 (first 100 elements): 25163.56 LRANGE_300 (first 300 elements): 10778.19 LRANGE_500 (first 500 elements): 6926.17 LRANGE_600 (first 600 elements): 5850.01 MSET (10 keys): 42444.82 XADD: 49925.11
3.汇总分析
3.1 延迟测试结果汇总
除7.1.240
版本外,延迟结果相差不大。
3.1 性能测试结果汇总
除7.1.240
版本外,性能测试结果相差不大,相对最好的是5.0.14
,稳定性上5.0.14和7.1.240
比较好,综合来说当前服务器最好的版本为5.0.14
。
4.其他参数
这里列举下比较重要的配置项
配置项名称 | 配置项值范围 | 说明 |
daemonize | yes、no | yes表示启用守护进程,默认是no即不以守护进程方式运行。其中Windows系统下不支持启用守护进程方式运行。 |
port | 指定 Redis 监听端口,默认端口为 6379。 | |
bind | 绑定的主机地址,如果需要设置远程访问则直接将这个属性备注下或者改为bind * 即可,这个属性和下面的protected-mode控制了是否可以远程访问 。 | |
protected-mode | yes 、no | 保护模式,该模式控制外部网是否可以连接redis服务,默认是yes,所以默认我们外网是无法访问的,如需外网连接redis服务则需要将此属性改为no。 |
timeout | 300 | 当客户端闲置多长时间后关闭连接,如果指定为 0,表示关闭该功能 |
loglevel | debug、verbose、notice、warning | 日志级别,默认为 notice |
databases | 16 | 设置数据库的数量,默认的数据库是0。整个通过客户端工具可以看得到 |
rdbcompression | yes、no | 指定存储至本地数据库时是否压缩数据,默认为 yes,Redis 采用 LZF 压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大。 |
dbfilename | dump.rdb | 指定本地数据库文件名,默认值为 dump.rdb |
dir | 指定本地数据库存放目录 | |
requirepass | 设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH 命令提供密码,默认关闭 | |
maxclients | 0 | 设置同一时间最大客户端连接数,默认无限制,Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息。 |
maxmemory | XXX | 指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后,Redis 会先尝试清除已到期或即将到期的 Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis 新的 vm 机制,会把 Key 存放内存,Value 会存放在 swap 区。配置项值范围列里XXX为数值。 |