Redis持久化策略之RDB和AFO

RDB方式(默认)

RDB方式的持久化是通过快照(snapshotting)来实现的。当符合一定的条件时Redis会自动将缓存中的所有数据进行快照并存储到硬盘上。进行快照的条件可以在配置文件中配置,主要有两个参数构成:时间+改动键的个数。当在指定的时间内发生变化的键数大于指定的数值时Redis就会进行快照。RDB是Redis默认使用的持久化策略方式,在配置文件中已经预置了三个条件:
save 900 1 #900秒内有至少1个键被更改则进行快照
save 300 10 #300秒内有至少10个键被更改则进行快照
save 60 10000 #60秒内有至少10000个键被更改则进行快照

可以同时配置多个快照条件,快照条件之间是或的关系,只要其中一个条件达到,就会触发快照。如果想要禁用自动快照,只需要将所有save参数删除即可。
Redis会将快照文件存储在当前目录的 dump.rdb文件中(可通过CONFIG GET dir来查看)。通过配置dir 和filename两个参数来改变快照文件的存放路径和文件名称。

Redis实现快照的过程

  1. Redis 使用fork 函数复制一份当前进程(父进程)的副本(子进程)。
  2. 父进程继续接受和处理客户端发来的请求。子进程开始将内存中的数据写入到磁盘中的临时文件。
  3. 当子进程写完所有数据后会使用心得rdb文件代替旧的rdb文件,至此完成一次快照的操作。
  4. 在执行 fork 函数的时后操作系统会使用写时复制策略(copy on write)。即 fork 执行的一刻,父进程和子进程共享同一个内存数据,当父进程要修改其中的某一片数据时,操作系统会复制一份该片数据以保证子进程的数据不会受到影响。所以新的RDB文件时执行fork函数一刻的内存数据。

Redis在快照过程中不会修改rdb文件,它在快照结束时使用新的rdb文件替换掉旧的rdb文件。我们可以利用这一特性,定时的备份rdb文件来实现 redis 数据备份。rdb文件是经过压缩的二进制格式(可以通过配置rdbcompression参数来禁用压缩节省cpu占用)。所以占用的空间比较内存小,更利于传输和保存。
除了自动快照,我们还可以手动发起SAVE或BGSAVE命令让Redis执行快照。这两个命令的区别在于:SAVE是由主进程进行快照操作,会阻塞其它请求。后者是通过fork子进程快照。Redis启动后会去读rdb文件,将数据从硬盘读取到内存。根据数据量的大小、数据的结构、服务器的性能差异,加载的时间也会存在差异。通常读取一个记录1G大小的字符型键值的rdb文件需要花费20-30秒。通过rdb持久化,一旦Redis异常退出,就会丢失最后一次快照后的全部数据。这个需要开发者根据实质的应用场合,通过组合设置自动快照的条件来降低数据的丢失的范围。如果数据丢是无法承受的,那么建议采用AOF方式持久化。

AOF持久化

默认情况下Redis是没有启用AOF方式持久化的,我们可以通过修改redis.conf中的appendonly参数来启用(appendonly yes)。启用AOF方式持久化,redis在启动时会逐个执行AOF文件中的命令来将硬盘中的数据载入到内存中,这个过程相比于RDB要慢。

启用AOF范式持久化后,redis每执行一次数据变更命令,Redis就会将该命令写入到AOF文件中。AOF文件保存位置与rdb相同,都是通过dir参数来设置的。默认文件名是appendonly.aof,可以通过appendfilename参数来修改。
配置redis自动重写AOF文件的条件

auto-aof-rewrite-percentage 100 # 当目前的AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据
auto-aof-rewrite-min-size 64mb # 允许重写的最小AOF文件大小
配置写入AOF文件后,要求系统刷新硬盘缓存的机制
appendfsync always # 每次执行写入都会执行同步,最安全也最慢
appendfsync everysec # 每秒执行一次同步操作
appendfsync no # 不主动进行同步操作,而是完全交由操作系统来做(即每30秒一次),最快也最不安全

Redis允许同时开启AOF和RDB,既保证了数据安全又使得进行备份等操作十分容易。此时重新启动Redis后Redis会使用AOF文件来恢复数据,因为AOF方式的持久化可能丢失的数据更少

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值