06 Redis持久化RDB和AOF

redis提供了持久化机制将内存中的数据写到硬盘里,以便于系统故障后可以恢复数据。redis提供了两种持久化操作。一种是RDB快照,另一种是AOF日志。

RDB快照是全量备份,是内存数据的二进制序列化形式,AOF日志记录的是内存数据修改的指令记录文本,是增量备份,需要定期进行AOF重写。

RDB快照持久化
  • RDB是快照模式,通过保存数据库中的键值对来记录数据库状态,生成的RDB文件是一个二进制文件,保存在硬盘中。所以即使Redis服务器退出,也可以使用硬盘中的RDB文件还原数据库的状态。
  • 快照是一次全量备份,通过保存键值对来记录数据库状态。
  • 持久化过程:
    • Redis使用操作系统的多进程 (Copy On Write) 机制来实现快照持久化。
    • Redis在持久化时会fork一个子进程,和父进程共享内存里面的数据。持久化完全交给子进程来处理,父进程继续处理客户端的请求,对数据进行修改。这时候就会使用操作系统的COW机制来进行数据段页面的分离,当父进程对其中一个页面的数据进行修改时,会将被共享的页面复制一份,对这个复制的页面进行修改,这时子进程相应的页面是没有变化的,所以子进程可以安心得遍历数据,并序列化到磁盘。
  • 优点:RDB优点: 数据恢复速度比 AOF快
  • 缺点:执行 fork 操作创建子进程的成本较高;存在丢失数据的风险,因为 RDB 快照文件每隔一段时间生成一次,如果 redis 宕机了,就会丢失这段时间的数据。
AOF日志持久化
  • AOF日志存储的是对内存修改的指令记录。Redis在收到客户端的修改指令后,先将指令存储到磁盘中AOF日志中,再执行指令。
  • 所以可以通过顺序执行所有的指令来恢复Redis的数据。
  • Redis长期运行,AOF日志会变得非常长,所以需要对AOF日志进行瘦身。
  • AOF重写过程:
    • Redis提供了 bgrewriteaof 指令用于对AOF进行瘦身。原理是
      • 开辟一个子进程对内存数据进行遍历转换成Redis操作指令,序列化到一个新的AOF日志文件中。子进程带有服务器进程的数据副本,所以使用子进程可以在不使用锁时保证数据的安全性。
      • redis 服务器会维护一个 AOF 重写缓冲区,用来记录 AOF操作期间执行的新命令。
      • 子进程序列化完毕后再将操作期间发生的增量AOF日志追加到这个新的AOF日志文件中,追加完毕后就替代旧的AOF日志文件,重写就完成了。
  • 优点: AOF 每隔一秒进行一次 fsync 同步刷盘的操作,将数据刷到硬盘,也就是最多只会丢失这一秒的数据。
  • 缺点:重放 AOF 日志的速度相比 RDB 来说会慢很多。
  • (了解)AOF 中的 fsync 函数可以将指定文件的内容强制从内核缓存刷到磁盘,以此来保证AOF日志不丢失,但 fsync 是一个磁盘IO操作,比较慢,它有三种可能的取值:
    • always:它让redis每执行一条指令就 fsync 一次,很影响效率。
    • everysec:它让redis每隔一秒执行一次 fsync 操作,在保持高性能的同时尽可能减少了数据的丢失。一般使用的这种,最多丢失一秒的数据。
    • no:它表示永不 fsync,而是让操作系统来决定什么时候同步磁盘,所以很不安全。
RDB 和 AOF 的区别:
  1. AOF 文件比 RDB 更新频率高,优先使用 AOF 还原数据;
  2. AOF比 RDB 更安全也更大;
  3. RDB 性能比 AOF 好;
  4. 如果两个都配了优先加载 AOF。
Redis 4.0混合持久化
  • 重启Redis时,如果用RDB来恢复数据,会丢失大量数据;如果用AOF日志来恢复,又会比较耗时。所以Redis 4.0提供了一个新的持久化选项—混合持久化。先加载RDB的内容,再重放增量的AOF日志,效率比较高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值