redis持久化机制AOF与RDB

        redis作为内存数据库,数据都保存在内存中。如果没有相应的持久化机制,一旦服务宕机,则数据会全部丢失。为解决数据罗盘问题,redis提供两种持久化机制AOF日志与RDB快照。

AOF

        AOF默认关闭,需要修改redis.conf中配置开启

appendonly no 是否开启AOF,yes开启

appendfilename "appendonly.aof" AOF文件名

aof-load-truncated yes 启动加载AOF时,AOF文件被受损是否可以正常启动,yes可以启动生成log,no不能启动

AOF持久化流程

        AOF写入与数据库的wal机制正好相反,在数据写入过程中先把数据写入内存,然后再写入日志。相对来说这种写入方式有优点也有缺点。

        优点:1.由于AOF日志中写入的是redis命令,先写内存可以省去检验命令是否正确步骤。

                   2.不阻塞写入操作。

        缺点:1.先写内存,突然宕机会导致数据丢失。

                   2.虽然避免阻塞写入操作,但是数据罗盘时慢也会导致后续操作无法进行。

        为了综合可用性与一致性,redis提供三种落盘机制,可通过redis.conf配置文件中appendfsync参数修改,6.2.5版本该参数默认为everysec。AOF默认关闭,需要修改appendonly参数进行开启。

刷盘时机缺点优点
Always请求完同步落盘每次写完都要落盘,降低性能,如果落盘阻塞会导致服务不可用可靠性高,最多丢当前写入的这条数据
Everysec写入的命令放入内存缓冲区,每秒落盘一次宕机会丢失上次落盘到现在的数据性能与可靠性综合
No写入的命令放入内存缓冲区,由操作系统决定合适落盘操作系统控制落盘,宕机不确定会丢多少数据性能好,但数据可靠性得不到保证

AOF构成

        AOF在记录时会记录写入命令,但会对原命令加以修改,以set test 1 命令举例。

        该命令中*3表示共三部分,$3表示下一个命令或值占用几个字节。

AOF重写

        由于AOF追加写入命令,当AOF文件过大时会影响redis写入性能,增加还原数据时间。为解决AOF文件过大问题,redis提供AOF重写功能。在进行AOF重写时,redis根据当前数据现状创建一个新的AOF文件,每条数据只保存最新的一个命令。例如原来 test这个key写入三次分别为set test 1,set test 2,set test 3。在AOF重写后只会保存set test 3这条命令。

AOF可通过如下方式配置重写

bgrewriteaof  手动AOF重写

auto-aof-rewrite-percentage 100 AOF增长百分比

auto-aof-rewrite-min-size 64mb  最小触发AOF重写的文件大小

AOF会记录文件大小auto-aof-rewrite-percentage设置为100时,当AOF文件大小是原来的一倍,并且大于64M才会触发重写

aof-use-rdb-preamble yes 是否开启AOF混合重写,开启后AOF重写时会先以RDB方式写入AOF文件,之后产生的数据以AOF方式追加到文件中

AOF重写流程

        在进行AOF重写时,redis主进程会fork出子进程进行重写,子进程采用(Copy On Write)机制将内存中数据转为命令写入AOF文件。由于此时主进程还在对外提供服务,redis会将最新的写入命令存储在新旧两个AOF文件中,当重写完成后使用新文件替换旧文件,此时会发生阻塞。

RDB

        RDB与AOF不同,不会记录写入命令,RDB会每隔一段时间将redis中数据保存到磁盘上与AOF相比做数据恢复时,可以直接把 RDB 文件读入内存,很快地完成恢复。但由于RDB是全量快照,频繁备份会影响redis性能。

手动生成RDB

        手动生成RDB命令为save,bgsave。

        save命令:主进程执行RDB,此时无法对外提供服务。

        bgsave命令:fork一个子进程用于RDB快照生成避免主进程阻塞,redis默认使用此方式。使用bgsave备份时同样会使用(Copy On Write)机制对fork子进程时的数据生成快照。

RDB配置

RDB默认开启,主要参数如下
save 900 1   900 秒内如果至少有 1 个 key 的值变化,则保存
save 300 10  300 秒内如果至少有 10 个 key 的值变化,则保存
save 60 10000 60 秒内如果至少有 10000 个 key 的值变化,则保存
以上三个条件有一个满足则会触发RDB保存

stop-writes-on-bgsave-error yes  yes时使用bgsave命令模式保存,不会阻塞主线程

rdbcompression yes 使用LZF压缩RDB文件

rdbchecksum yes 存储和加载RDB是否开启校验,开启会降低性能

dbfilename dump.rdb RDB文件名

rdb-del-sync-files no  没启用持久化的实例是否删除其RDB文件

dir ./ 文件保存路径


        

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值