redis持久化性能测试

本文测试了Redis在不同内存占用及持久化方式下的性能表现,包括RDB与AOF的对比,以及不同数据量级下的命令执行效率。
一、总结分析
       经过测试,在redis同时开启rdb和aof做持久化数据备份的情况下:
 测试在环境redis的内存从0-3.35G的情况下
(a)每个命令的执行性能基本稳定,除LRANGE命令外基本都在5W request/s以上。
(b)重启速度随着持久化文件的变大,而变长。
(c)在redis数据需要内存3.35G,aof:5.9G的情况下,关闭redis,执行shutdown:33.91s,启动加载数据到redis内存需要20.189s。
(d)range的性能随着所取条数的变大而急速下降,因此在使用LRANGE的时候,需要尤其注意。
由于rdb是定时做对redis内存做快照,因此速度比较快,但是也容易丢失数据,aof是追加日志的方式,数据丢失少。通过以下测试,建议:使用redis自身持久化方式,并且同时开启rdb和aof两种持久化测试,rdb根据具体业务定时快照,aof也可以根据具体业务定时rewrite来增加性能

二、在beta环境安装redis做测试

环境配置如下:
Mem:65801104k ,free:43711948k
os:Linux 2.6.32-358.2.1.el6.x86_64 x86_64

redis版本2.8.4,配置:
redis开启RDB save 900 1 (15min内有1次save动作就做快照)
aof:appendfsync everysec

1、安装redis之后redis内存中没有数据的情况下,直接测试:
(a)、redis-benchmark -n 100000 -c 20 -d 256 :20个客户端并发发送了10000个请求,256字节
插入速度最高是的命令SADD:57142 request/s,其它命令基本都在5W以上,只有LRANGE取前100条的时候14556 request/s,其取的条数越多,效率急速下降

(b)、redis-benchmark -n 100000 -c 20 -d 1024,发送1024字节的情况:
插入速度最快的命令是SADD:57471 request/s,其它命令略有下降,只有LRANGE取前100条的时候5546 request/s,其取的条数越多,效率比发送256字节降的更快、更急

2、通过cat data.txt | redis-cli --pipe导入数据,1048576(512*1024*2)个key,value为字符串,每个字符串512b,整个文件(data.txt)大小为512M,产生的aof为548M,dump.rpb尚未生成
(a)、redis-benchmark -n 100000 -c 20 -d 256
插入速度最高是的命令SADD:57142 request/s,其它命令基本都在5W以上,只有LRANGE取前100条的时候15243 request/s,其取的条数越多,效率急速下降

(b)、redis-benchmark -n 100000 -c 20 -d 1024,发送1024字节的情况:
插入速度最高是的命令SADD:56497 request/s,其它命令略有下降,只有LRANGE取前100条的时候5515 request/s,其取的条数越多,效率急速下降

这时候的命令执行性能和在第一次安装redis的时候,基本保持一致
这时候查看redis内存情况:

执行完两个测试之后,持久化文件大小:aof:956M,rdb:372M
内存情况:used_memory:942001704
used_memory_human:898.36M
used_memory_rss:959778816
used_memory_peak:950352256
used_memory_peak_human:906.33M

(c)、redis启动、关闭速度:
这时候关闭redis,执行shutdown :8.74s启动redis加载数据时间:DB loaded from append only file: 3.727 seconds

3、仍然通过cat data.txt | redis-cli --pipe方式,向redis内存添加测试数据
这时redis内存情况:
used_memory:3426856328
used_memory_human:3.19G
used_memory_rss:3472187392
used_memory_peak:3460409832
used_memory_peak_human:3.22G
持久化文件大小:appendonly.aof:4.2G   dump.rdb:1.5G
这时候重启redis:执行shutdown:34.90s,
启动:DB loaded from append only file: 23.425 seconds

(a)、redis-benchmark -n 100000 -c 20 -d 256
插入速度最高是的命令SADD:57142 request/s,其它命令基本都在5W以上,只有LRANGE取前100条的时候15037 request/s,其取的条数越多,效率急速下降
(b)、redis-benchmark -n 100000 -c 20 -d 1024
插入速度最高是的命令SADD:56179 request/s,其它命令略有下降,只有LRANGE取前100条的时候5396 request/s,其取的条数越多,效率急速下降

执行完后:
used_memory:3596452760
used_memory_human:3.35G
used_memory_rss:3663298560
used_memory_peak:3694021168
used_memory_peak_human:3.44G

执行完aof:5.9G
shutdown:33.91s
启动:DB loaded from append only file: 20.189 seconds

4、在不开启任何持久化的情况下:
(a)、redis-benchmark -n 100000 -c 20 -d 256
cpu使用 15.3%
性能最高的命令INCR:67114 request/s, SADD:57471 request/s, 其它命令出LRANGE外基本都在5W request/s以上,Lrange取前100条14409request/s。随着条数的变大,性能急速下降

(b)、redis-benchmark -n 100000 -c 20 -d 1024
cpu最高使用率16.9%
插入性能最高INCR:57803 request/s, SADD:57142 request/s, 其它命令出LRANGE外基本都在5W request/s以上,比发送256B字节的时候略低一点点。LRANGE取前100条5956 request/s。
随着条数的变大,性能急速下降

5:开启aof和rdb持久化的情况下监控CPU的使用情况
redis内存情况
used_memory:3633251800
used_memory_human:3.38G
used_memory_rss:3692384256
used_memory_peak:3672120888
used_memory_peak_human:3.42G
aof:6.3G
(a)、redis-benchmark -n 100000 -c 20 -d 256
插入性能最高的命令SADD:57142  request/s, 其它命令出LRANGE外基本都在5W request/s以上,Lrange取前100条14409request/s。随着条数的变大,性能急速下降
cpu使用了最高20%

(b)、redis-benchmark -n 100000 -c 20 -d 1024
插入性能最高的命令SADD:57803  request/s, 其它命令出LRANGE外基本都在5W request/s以上,Lrange取前100条5518request/s。随着条数的变大,性能急速下降
cpu 16.9%


### 三级标题:如何测试 Redis持久化功能(RDB 和 AOFRedis 提供了两种主要的持久化机制:RDB(Redis Database)和 AOF(Append Only File),用于将内存中的数据保存到磁盘中,从而在服务重启或崩溃时恢复数据。为了验证持久化功能是否正常工作,可以通过以下方式进行测试。 #### 1. RDB 持久化测试方法 RDB 持久化通过快照方式将数据保存到磁盘文件中,通常用于大规模数据恢复场景。测试时可以手动触发 `SAVE` 或 `BGSAVE` 命令,观察是否生成 `.rdb` 文件并验证数据是否正确恢复。 - **手动触发 RDB 快照**: ```bash redis-cli save ``` 该命令会阻塞 Redis 主进程,直到 RDB 文件写入完成。另一种非阻塞方式是使用 `BGSAVE`: ```bash redis-cli bgsave ``` 该命令会在后台创建子进程进行持久化操作,不会影响主进程响应请求。 - **验证 RDB 文件生成**: 检查 Redis 配置文件中定义的 `dir` 和 `dbfilename` 参数,确认 RDB 文件的保存路径和文件名。例如: ```bash dir /usr/local/redis/data dbfilename dump.rdb ``` 在执行 `BGSAVE` 后,检查指定目录是否生成 `dump.rdb` 文件。 - **模拟重启验证数据恢复**: 关闭 Redis 服务后重新启动,检查数据是否从 RDB 文件中正确加载。使用 `redis-cli keys *` 查看所有键值,确认数据是否完整。 #### 2. AOF 持久化测试方法 AOF 持久化通过记录所有写操作命令来实现数据持久化,适合对数据完整性要求较高的场景。测试 AOF 功能时,需要启用 AOF 并观察日志文件的生成和内容。 - **启用 AOF 持久化**: 在 `redis.conf` 中设置以下参数以启用 AOF: ```conf appendonly yes appendfilename "appendonly.aof" ``` 可以选择不同的同步策略(如 `appendfsync always`、`appendfsync everysec`、`appendfsync no`)以平衡性能和数据安全性。 - **验证 AOF 文件生成**: 执行写操作后,检查 `appendonly.aof` 文件是否生成,并查看其内容是否包含对应的 Redis 命令。例如: ```bash redis-cli set test_key "value" ``` 打开 `appendonly.aof` 文件,应能看到类似 `*3\r\n$3\r\nSET\r\n$7\r\ntest_key\r\n$5\r\nvalue\r\n` 的 Redis 协议内容。 - **测试 AOF 重写**: AOF 会定期进行重写以压缩文件体积。可以手动触发 AOF 重写命令: ```bash redis-cli bgrewriteaof ``` 该命令会创建子进程进行 AOF 文件重写,确保不影响主进程性能。 - **模拟重启验证 AOF 恢复**: 关闭 Redis 服务并重新启动,确保 AOF 文件被正确加载。使用 `redis-cli info persistence` 查看 AOF 加载状态。 #### 3. 持久化性能与稳定性测试 - **测试持久化性能影响**: 在高并发写入场景下,启用 RDB 或 AOF 持久化会对性能产生影响。可以通过 `redis-benchmark` 工具模拟高并发写操作,观察吞吐量变化: ```bash redis-benchmark -n 100000 -c 50 SET test_key value ``` - **测试持久化失败处理机制**: 如果 `BGSAVE` 执行失败,Redis 可以通过配置项 `stop-writes-on-bgsave-error yes` 阻止写操作,以避免数据丢失。可以手动模拟 `BGSAVE` 失败(如磁盘空间不足),观察 Redis 是否阻止写入操作。 - **测试 RDB 和 AOF 同时启用的情况**: 在生产环境中,通常建议同时启用 RDB 和 AOF 以提高数据可靠性。测试时确保两者配置正确,并验证在重启时优先使用 AOF 文件进行恢复。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值