面试题答案
一键面试数据保存频率
- RDB:
- 按照配置规则定期保存数据快照,比如配置
save 900 1
表示900秒内如果有1个键被修改则进行一次快照保存。也可以手动执行SAVE
或BGSAVE
命令触发。这种策略并非实时保存数据,可能会在两次保存之间丢失数据。
- 按照配置规则定期保存数据快照,比如配置
- AOF:
- 默认是每秒钟将写命令追加到AOF文件(通过
appendfsync everysec
配置)。也可选择always
,即每次写操作都立即同步到AOF文件,保证数据不丢失,但会严重影响性能;或者no
,由操作系统决定何时同步数据,性能较高但可能丢失较多数据。
- 默认是每秒钟将写命令追加到AOF文件(通过
文件结构
- RDB:
- 是一个紧凑的二进制文件,它存储了某个时间点Redis数据库的所有键值对数据。这种结构占用空间小,便于进行数据备份和恢复。例如,如果有多个相同的字符串值,RDB文件会共享这些值,不会重复存储。
- AOF:
- 是一个日志文件,以文本形式记录Redis服务器执行的每一个写操作命令。文件内容可读性强,例如记录
SET key value
这样的命令。随着写操作增多,文件体积会不断增大,不过可以通过重写机制(BGREWRITEAOF
)对文件进行压缩。
- 是一个日志文件,以文本形式记录Redis服务器执行的每一个写操作命令。文件内容可读性强,例如记录
恢复速度
- RDB:
- 恢复速度相对较快,因为在恢复时,Redis只需将RDB文件中的数据一次性加载到内存中。特别是对于大数据量的恢复,RDB的优势更为明显,因为它读取的是二进制文件,加载过程相对简单。
- AOF:
- 恢复速度相对较慢,尤其是AOF文件较大时。因为恢复时Redis需要重新执行AOF文件中的每一条写命令,构建出数据库状态。不过,如果开启了AOF重写,恢复速度会有所提升,因为重写后的AOF文件包含的冗余命令较少。
对性能影响
- RDB:
- 在执行
SAVE
命令时,会阻塞主线程,直到RDB文件生成完毕,严重影响Redis性能。而BGSAVE
命令虽然会fork出一个子进程来进行RDB文件生成,主线程可以继续处理客户端请求,但fork操作本身会消耗一定的内存和CPU资源,在数据量较大时可能会对性能产生一定影响。
- 在执行
- AOF:
always
模式下,每次写操作都要同步到AOF文件,会严重影响Redis的写入性能,因为I/O操作相对较慢。everysec
模式下,每秒同步一次,对性能影响相对较小,但在这一秒内如果发生宕机,仍然可能丢失这一秒内的数据。no
模式虽然性能较好,但数据安全性较差,丢失数据的风险较高。另外,AOF重写过程也会消耗一定的CPU和内存资源,但一般对性能影响相对RDB的fork操作要小一些。