先说一下配置,以及rdb文件格式
配置方面
#redis日志文件
logfile "/usr/local/redis/log/redis.log"
#rdb自动策略之 900秒内有1个更改会触发生成rdb
save 900 1
#rdb自动策略之 300秒内有10个更改会触发生成rdb
save 300 10
#rdb自动策略之 60秒内有10000个更改会触发生成rdb
save 60 10000
#bgsave生成rdb的时候出现错误是否停止写入rdb
stop-writes-on-bgsave-error yes
#rdb文件是否压缩
rdbcompression yes
#是否对rdb文件进行校验
rdbchecksum yes
#生成的rdb文件名称
dbfilename dump.rdb
#rdb文件存放的路径
dir /usr/local/redis/data/
redis数据情况为空,添加一条数据,并且使用save 命令生成rdb
去看看rdb文件
打开看一看,生成的是一个redis快照的文件
下面来看看生成rdb 的几种方式
一.save命令生成RDB
在客户端使用save 命令生成rdb文件,该方案是阻塞的,也就是说会阻塞其他redis命令的执行,必须把rdb 生成完才会执行其他命令
下面来演示一下是否阻塞
先插入200W条数据到redis,不然数据量太小保存得太快,不好演示
使用PHP 插入进去
$redis = new Redis();
$redis->connect('192.168.1.13',6379);
for ($i = 0; $i < 2000000; $i++) {
$redis->set('test_key' . $i, $i);
}
然后使用命令行执行一下,你的PHP需要安装redis扩展,具体安装可以看看我其他的文章
执行完成之后,看看数据库情况
然后开两个窗口,一个先执行save,另一个执行get操作
可以看到确实阻塞了
可以查看日志,会出现一条 DB saved on disk 的日志
总结:该方式是同步阻塞优点是不会额外消耗内存,缺点很明显就是会阻塞其他命令,那么又没异步的方式呢?
二.bgsave命令生成RDB
除了save命令还有一条bgsave 命令,该方式是异步非阻塞(不完全),使用方式跟save 一样
执行bgsave 之后redis会开启一个子进程(redis-rdb-bgsave)来生成rdb文件
异步执行开始时会出现 Background saving started by pid 3727 这样的日志
执行完成之后可以在日志文件看到 Background saving terminated with success 这样的一条日志
总结:虽然说bgsave 是非阻塞的,但是在redis开启子进程的时候依然是阻塞的,在特殊情况下还是会阻塞,并且会消耗额外的内存。
三.根据策略自动生成RDB
也就是配置的
#rdb自动策略之 900秒内有1个更改会触发生成rdb
save 900 1
#rdb自动策略之 300秒内有10个更改会触发生成rdb
save 300 10
#rdb自动策略之 60秒内有10000个更改会触发生成rdb
save 60 10000
下面进行测试,将策略设置为 60秒变动3次就生成rdb
重启redis
先看 之前的rbd s 20:19生成的
接下来新增3条数据
观察日志
可以看到在60秒内变动超过3条就会触发策略自动生成rdb文件,也可以看出其实就是执行了bgsave 命令,感兴趣的可以自己验证一下
四.其他情况
- 全量复制
redis在主从复制的时候会生成rdb文件来复制 - debug reload
redis提供的debug 重启 就是说不清空内存数据的重启 这种情况也会生成rdb文件 - shutdown
关闭redis 的时候也会触发生成rdb文件 - flushall
清空redis数据 也会生成一个空的rdb文件,因为数据没有了生成的也肯定是一个空的
五.总结
rdb文件都是先生成再替换掉原来的rdb文件,不妨来看看
当执行到save 或者bgsave 的时候会产生一个临时文件,执行完成之后临时文件就被删除掉了
save 同步阻塞
bgsave 异步非阻塞,但是在创建子进程的时候是阻塞的
策略 满足任意策略的都会执行