Redis 如何保证数据不丢失?

前段时间表妹收到了小米秋招补录的面试邀请,一面还算顺利,很快就通过了,但在看二面面试录屏的时候 , 我发现了一个问题,有一道面试题回答的不是很好,也就是我们今天要聊的这个问题:redis 如何保证数据不丢失?
很多人看到这个问题的第一反应是,这个问题不难,就是 Redis 的持久化技术嘛!但如果你这样回答,可能只能得 50 分 , 连及格线都没到 , 为什么呢?
因为 , Redis 保证数据不丢失的主要手段有两个:

  • 持久化
  • 集群运行
我们分别来看它们两的具体实现细节 。
1、Redis 持久化持久化是指将数据从内存中存储到持久化存储介质中(如硬盘)的过程 , 以便在程序重启或者系统崩溃等情况下,能够从持久化存储介质中恢复数据 。
Redis 4.0 之后支持以下 3 种持久化方案:
  • RDB(Redis DataBase)持久化:快照方式持久化,将某一个时刻的内存数据,以二进制的方式写入磁盘;
  • AOF(Append Only File)持久化:文件追加持久化,记录所有非查询操作命令,并以文本的形式追加到文件中;
  • 混合持久化:RDB + AOF 混合方式的持久化,Redis 4.0 之后新增的方式 , 混合持久化是结合了 RDB 和 AOF 的优点,在写入的时候,先把当前的数据以 RDB 的形式写入文件的开头 , 再将后续的操作命令以 AOF 的格式存入文件,这样既能保证 Redis 重启时的速度,又能减低数据丢失的风险 。
(1)RDB 持久化RDB(Redis Database)是将某一个时刻的内存快照(Snapshot),以二进制的方式写入磁盘的持久化机制 。
RDB 持久化机制有以下优缺点:
优点:
  • 速度快:相对于 AOF 持久化方式,RDB 持久化速度更快 , 因为它只需要在指定的时间间隔内将数据从内存中写入到磁盘上 。
  • 空间占用?。篟DB 持久化会将数据保存在一个压缩的二进制文件中,因此相对于 AOF 持久化方式,它占用的磁盘空间更小 。
  • 恢复速度快:因为 RDB 文件是一个完整的数据库快照,所以在 Redis 重启后,可以非常快速地将数据恢复到内存中 。
  • 可靠性高:RDB 持久化方式可以保证数据的可靠性,因为数据会在指定时间间隔内自动写入磁盘,即使 Redis 进程崩溃或者服务器断电,也可以通过加载最近的一次快照文件恢复数据 。
缺点:
  • 数据可能会丢失:RDB 持久化方式只能保证数据在指定时间间隔内写入磁盘,因此如果 Redis 进程崩溃或者服务器断电 , 从最后一次快照保存到崩溃的时间点之间的数据可能会丢失 。
  • 实时性差:因为 RDB 持久化是定期执行的,因此从最后一次快照保存到当前时间点之间的数据可能会丢失 。如果需要更高的实时性,可以使用 AOF 持久化方式 。
所以 , RDB 持久化方式适合用于对数据可靠性要求较高,但对实时性要求不高的场景,如 Redis 中的备份和数据恢复等 。
(2)AOF 持久化AOF(Append Only File)它是将 Redis 每个非查询操作命令都追加记录到文件(appendonly.aof)中的持久化机制 。
AOF 持久化机制有以下优缺点:
优点:
  • 数据不容易丢失:AOF 持久化方式会将 Redis 执行的每一个写命令记录到一个文件中,因此即使 Redis 进程崩溃或者服务器断电,也可以通过重放 AOF 文件中的命令来恢复数据 。
  • 实时性好:由于 AOF 持久化方式是将每一个写命令记录到文件中,因此它的实时性比 RDB 持久化方式更好 。
  • 数据可读性强:AOF 持久化文件是一个纯文本文件 , 可以被人类读取和理解,因此可以方便地进行数据备份和恢复操作 。
缺点: