Redis 持久化RDB与AOF(二) :AOF
1、介绍
redis也是要将数据持久化,为的就是当redis重启时可以将持久化的数据重新读入到内存中。持久化又分 **RDB(Redis Database)**和 **AOF(Append Only File)**两种方式,两种方式各有千秋,因环境而异。
2、RDB持久化方式
rdb是redis默认开启的持久化方式,通过配置规则来持久化数据。在持久化时Redis会Fork(相当于复制)一个子进程进行将内存中的数据写入到零时文件,等全部都写完再替换上一次持久化的文件。
2.1 配置文件
在配置文件 SNAPSHOTTING 这一项下面就有案例,我们可以看到格式为 save <秒数> <改变数> ;其中 save为固定写法,后面两个参数描述的是 在多少秒改变多少个元素后,在这个规则秒数最后一秒执行保存;比如你Redis是12:04:04秒启动的,然后我配置的规则是 save 120 2 ,当我改变了2个以上元素后并不会马上执行,而是等到 12:06:03秒才执行!
################################ SNAPSHOTTING ################################
# Save the DB on disk:
# save <seconds> <changes>
save 900 1 # 900秒内发生了一次改变元素会保存,
save 300 10 # 300秒内发生了10次改变元素会保存
save 60 10000 # 60秒内发生了10000次改变元素会保存
2.2、rdb文件介绍
rdb文件是由子进程创建的,里面包含的是最后一次写入的内存数据
2.2.1、配置rdb生成的目录介绍
# dbfilename 用于配置rdb文件生成后的名称。 生成的路径为 dir/dbfilename 例如:/home/qiaolin/dump.rdb
dbfilename dump.rdb
# rdb和后面说的aof方式生成的文件默认都会放到该目录下,dir默认为 ./ 其实也就是说以你启动redis-server的目录为工作目录
# 由于redis所在的目录配置了环境变量,我可以在任何地方启动;例如:我在 /home/qiaolin/ 下
# 运行 redis-server /config/redis.config 这时候我redis的工作目录就为 /home/qiaolin/
dir ./
# 你可以通过redis-cli客户端连接到这个redis-server 执行 config get dir 获取到当前工作目录
# 你也可以通过执行 config set dir 新工作目录 来切换工作目录
2.2.2、修复rdb文件
在子进程将内存中的数据写入到rdb文件的时候可能会出现异常情况,例如断电,网络延迟导致文件没写全;当Redis重启读该备份文件时就会出错。Redis也提供了修复的工具,一般会跟 redis-server存在相同目录下。当我们rdb文件出现问题时可以执行修复命令。
redis-check-dump 你的rdb文件
3、触发持久化
上面我们说到达到了多少秒修改多少元素时会执行rdb方式的持久化操作,这是属于自动的,按照官方的配置如果你只改变了一个元素需要等待900秒也就是15分钟才会将当前内存中的数据Fork(复制)子进程然后写入零时文件覆盖原dump.rdb文件,有时候我们就想立刻保存,那怎么办!其实有即可命令可以实现立刻保存!
命令 | 说明 |
---|---|
save | 主进程进行保存,这时候写入数据的操作会阻塞 |
bgsave | 跟自动触发一样,子进程进行保存 |
flushall | 清空全部db时,会把你得dump.rdb清空, 而 flushdb不会,他还是会等待触发条件达成 |
shutdown | 关闭redis-server 此时会进行rdb持久化 |
4、优势
生成的rdb文件体积小,恢复起来数据比较快,我们可以打开生成的 dump.rdb查看,里面都是很精简的数据
5、劣势
1、在达到执行条件时会Fork(复制)主进程产生一个子进程 ,子进程中也拥有一份跟主进程一摸一样的数据,也就是数据多了一倍。
2、如果你修改了几个元素,但是还没达到条件持久化并且此时redis挂掉了,此时就会丢失最后操作的数据。
6、关闭RDB持久化
两种方式
1、修改配置文件注释持久化规则
################################ SNAPSHOTTING ################################
# Save the DB on disk:
# save <seconds> <changes>
# save 900 1 # 900秒内发生了一次改变元素会保存,
# save 300 10 # 300秒内发生了10次改变元素会保存
# save 60 10000 # 60秒内发生了10000次改变元素会保存
2、关闭rdb持久化方式,我们需要在 redis-cli 连接内执行命令
查看当前规则:
7、其他补充
1、当你同时开启 rdb 和 aof 方式时,redis不会加载你得 dump.rdb 备份文件,即使 aof持久化文件不存在!