redis面试题——持久化机制:RDB,AOF

1. 持久化方式RDB和AOF的区别和原理?

  • RDB原理:RDB是快照模式,通过保存数据库中的键值对来记录数据库状态,生成的RDB文件是一个二进制文件,保存在硬盘中。在进行 RDB 持久化时,会 fork 一个子进程,和父进程共享内存里面的代码段和数据段。快照持久化完全交给子进程来处理,父进程继续处理客户端的请求。当父进程对数据段的某个页面的数据进行修改时,会使用操作系统的 Copy On Write (COW) 机制进行数据段的页面分离,将被共享的页面复制一份分离出来,然后对这个复制的页面进行修改。子进程相应的页面是没有变化的,所以子进程可以非常安心的遍历数据,序列化写到磁盘。
  • RDB优点: 数据恢复速度比 AOF 快。
  • RDB缺点: 如果文件很大,fork 一个子进程生成一个大快照会对系统产生影响;存在丢失数据的风险,因为 RDB 快照文件每隔一段时间生成一次,如果 redis 宕机了,就会丢失这段时间的数据。

  • AOF原理:AOF的原理是通过保存 redis 服务器所执行的修改指令来记录数据库状态。当 redis 收到客户端发来的修改指令时,先将指令文本存到 AOF 日志中,然后再执行指令,这样即使忽然宕机,也可以通过重放 AOF 日志中的指令来恢复到宕机前的状态。AOF 日志在长期的运行过程中会变的无比庞大,指令重放的时间就会比较长,所以需要定期进行 AOF 重写,给 AOF 日志瘦身。
  • AOF优点: AOF 每隔一秒进行一次 fsync 操作,将数据刷到硬盘,也就是最多只会丢失这一秒的数据。
  • AOF缺点: 重放 AOF 日志的速度较慢,可能花费很长时间。

(了解)AOF 中的 fsync 函数可以将指定文件的内容强制从内核缓存刷到磁盘,以此来保证AOF日志不丢失,但 fsync 是一个磁盘IO操作,比较慢,它有三种可能的取值:

  1. always:它让redis每执行一条指令就 fsync 一次,很影响效率。
  2. everysec:它让redis每隔一秒执行一次 fsync 操作,在保持高性能的同时尽可能减少了数据的丢失。一般使用的这种,最多丢失一秒的数据。
  3. no:它表示永不 fsync,而是让操作系统来决定什么时候同步磁盘,所以很不安全。

2. redis4.0 新的持久化方案:混合持久化

  • 混合持久化:将 RDB 文件和 AOF 日志文件存在一起。这里的 AOF 日志指的是从持久化开始到持久化结束的这段时间发生的增量 AOF 日志,通常这部分 AOF 日志很小。于是在 Redis 重启时,可以先加载 RDB 的内容,然后再重放 AOF 日志,重启效率大幅提升。

3. AOF重写功能的原理

  • redis提供了 bgrewriteAOF 指令来对 AOF 日志进行瘦身,它首先开辟一个子进程,这样做的好处是:①子进程进行AOF重写时,服务器进程可以继续处理请求,②子进程带有服务器进程的数据副本,所以使用子进程可以在不使用锁时保证数据的安全性。在执行 bgrewriteAOF 命令时,redis服务器会维护一个AOF重写缓冲区,它会在子进程创建新AOF文件期间,记录服务器执行的所有写命令。
  • 然后这个子进程对内存进行遍历,转换成一系列redis的操作指令,序列化到新的 AOF 日志文件中。
  • 最后再通过 AOF重写缓冲区将操作期间发生的增量AOF日志追加到这个新的AOF日志文件中,它就可以代替旧的AOF日志文件了,瘦身工作完成。

你可能感兴趣的:(redis)