Redis~实现持久化的三种方式:快照方式(RDB)、文件追加方式(AOF)、混合持久化方式

何为持久化

  • 所谓持久化就是将数据用内存保存到磁盘的工程, 其目的就是防止数据的丢失

因为内存中的数据 在服务器重启之后就会丢失,⽽磁盘的数据则不会,因此为了系统的稳定起⻅,我们需要将数据进⾏持久 化。同时持久化功能⼜是 Redis 和 Memcached 最主要的区别之⼀,因为 Redis ⽀持持久化⽽ Memcached 不⽀持

快照方式(RDB, Redis Database)

  • 将某一时刻的内存中的数据以二进制的方式写入到磁盘中

优点

  1. RDB的内容为二进制形式, 占用的内存小, 更适合做为备份文件
  2. RDB对灾难恢复很有用, 因为其的小巧紧凑, 可以很快的传输到远程的服务器上进行Redis服务恢复
  3. 可以很大程度提高Redis的运行速度, 因为每次持久化时, 主进程都会fork一个子进程来进行数据持久化到磁盘, 这样就减少了主进程的任务负担, 从而提高了主进程的效率
  4. 与AOF格式的文件相比, RDB文件重启更快

缺点

  1. RDB只能保存某个时间段间隔的数据, 如果在一个间隔中途Redis服务器突然挂了, 就有丢失数据的风险
  2. 上面说到RDB进行持久化操作的时候会创建一个子进程来完成, 但是如果某时间段数据集非常大, fork()很多的子进程很耗时, 并且如果CPU处理能力不行的话, 可能会导致Redis停止位客户端服务一段时间(因为Redis操作很重要一个特性就是其内存是原子操作)

文件追加方式(AOF, Append Only File)

  • 记录所有操作的命令, 并以文本的形式追加到文件中

优点

  1. AOF 保存的数据更加完整, 数据不易丢失, AOF 提供了三种保存策略:每次操作保存、每秒钟保存⼀次、跟随 系统的持久化策略保存,其中每秒保存⼀次,从数据的安全性和性能两⽅⾯考虑是⼀个不错的选择,也 是 AOF 默认的策略,即使发⽣了意外情况,最多只会丢失 1s 钟的数据
  2. AOF使用的是命令追加的写入方式, 所以不会出现文件损坏的问题, 即使意外损坏也较易恢复
  3. AOF 持久化⽂件,⾮常容易理解和解析,它是把所有 Redis 键值操作命令,以⽂件的⽅式存⼊了磁 盘。即使不⼩⼼使⽤ flushall 命令删除了所有键值信息,只要使⽤ AOF ⽂件,删除最后的 flushall 命令,重启 Redis 即可恢复之前误删的数据.

缺点

  1. 对比RDB保存相同的数据 使用AOF资源消耗更大
  2. Redis 负载较高的时候, 使用RDB更好
  3. RDB 使⽤快照的形式来持久化整个 Redis 数据,⽽ AOF 只是将每次执⾏的命令追加到 AOF ⽂件 中,因此从理论上说,RDB ⽐ AOF 更健壮

混合持久化方式

  • 混合顾名思义就是结合了RDB和AOF的优点, 在写入的时候, 先把数据以RDB的形式写入文件的开头, 再将后续的操作命令以AOF的格式保存到文件中去, 这样就保证Redis重启时的速度, 又能减轻数据丢失的风险

优点

  1. 结合RDB的特点和AOF的特点, 开头以RDB的格式, 可以快启动, 同时结合AOF的特点, 可以减少数据丢失的风险

缺点

  1. 结合俩者的特性, 导致AOF文件的可读性下降
  2. 兼容性差, 如果开启混合持久化AOF文件, 不能使用Redis4.0之前的版本
  • 可以在 redis-cli 命令⾏中执⾏ config set aof-use-rdb-preamble yes 来开启混合持久化,当 开启混合持久化时 Redis 就以混合持久化⽅式来作为持久化策略;当没有开启混合持久化的情况下,使⽤ config set appendonly yes 来开启 AOF 持久化的策略,当 AOF 和混合持久化都没开启的情况 下默认会是 RDB 持久化的⽅式。
    其优点级: 混合持久化 > 文件追加持久化 > 快照持久化

猜你喜欢

转载自blog.csdn.net/Shangxingya/article/details/108472068