Redis 持久化:快照和AOF

来源:互联网 发布:fx2da模块数据 编辑:程序博客网 时间:2024/06/11 00:38

Redis持久化数据到硬盘有那些方法?

方法一:快照(snapshotting),将某一时刻的所有数据写入硬盘中。(注意是:全量更新的)


默认给出的策略是:

#900秒(15分钟)内有一个keys改变

#300秒(5分钟)内有10个keys改变

#60秒(1分钟)内有10000个keys改变

什么时候更新快照?

如果未注释上面的三个快照持久化策略,此时产生快照持久化的情况有:(1)上述三个策略任意一个满足都将持久化文件;(2)执行redis-cli中shutdown操作或者kill redis进程号;上述两种情况都将产生持久化文件。

如果无需快照周期性持久化,只需将三个策略注释掉。(此时,如果执行shutdown或者kill redis进程号也不会将内存的数据持久化到快照文件中

当然,我们也可以通过显示命令来持久化快照,有两种方式(手动更新快照):(1)在redis客户端redis-cli,执行bgsave;(2)或者执行save;注意:bgsave和save的区别是:bgsave是单独开启一个进程来进行备份,而父进行继续处理命令请求;而save命令会一直阻塞直至快照创建完毕,执行速度比bgsave快的多。


方法二:只追加文件(append-only file,AOF),它会将执行写命令时,将被执行的命令复制到AOF文件的末尾,以此来记录数据发生的变化。因此,Redis只要从头到尾执行一次AOF文件包含的所有命令,就可以恢复AOF文件记录的数据。(可能的问题:数据冗余,产生的文件非常大,最多只可能丢失一秒内产生的数据,如果同步频率用:everysec)

开启AOF持久化的


只需要将appendonly默认为no改为yes即可,其文件的位置与快照文件在同一目录下,即上面按个dir的目录。aof持久化后的文件名为appendonly.aof

如果同时开启快照持久化和aop持久化,redis-server启动默认加载的数据库文件是appendonly.aof。

appendfsync选项及同步频率


always:每个Redis写命令都要同步写入硬盘,这样会严重降低Redis的速度

everysec:每秒执行一次同步,显示地将多个写命令同步到硬盘(推荐)

no:让操作系统决定应用何时进行同步

针对AOF持久化文件冗余导致文件过大解决措施

不难从AOF定义可以看出,如果对相同的数据,比如set aa 123,然后再set aa 333,AOF文件中保存了上面两个操作,而实际上只需保存set aa 333即可。

措施一 在redis.conf中配置:


在redis.conf中配置如上参数,那么当AOF文件的体积大于64mb,且AOF文件的体积比上一次重写之后的体积大了至少一倍(100%)的时候,Redis将执行bgrewriteaof命令。

措施二 显示的调用bgrewriteaof:

在redis中提供了重写AOF文件的命令:bgrewriteaof,能够移除AOF中的冗余指令,使得AOF文件尽可能的小。该命令与快照中bgsave相似,都是创建一个子进程来处理的。(重写命令:会产生一个新的重写的文件,并删除旧的aof文件,而删除一个大的AOF文件可能会让系统挂起数秒)。


问题:如果Redsi同时开启快照和AOF持久化,则Redis重启时会去加载那个文件,如果只是AOF文件呢?

答:不管是否开启快照持久化还是AOF持久化:在Redis在首次加载时,会先去查找dum.rdb文件,如果找不到才去找AOF文件。



原创粉丝点击