面试题答案
一键面试RDB(Redis Database)
- 工作原理:
- 触发机制:
- 手动触发:执行SAVE或BGSAVE命令。SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完成;BGSAVE命令则会fork一个子进程来负责创建RDB文件,主进程继续处理客户端请求。
- 自动触发:满足在redis.conf配置文件中设置的save条件时,如
save 900 1
表示900秒内如果至少有1个键被修改,则自动触发BGSAVE。
- 数据存储:将Redis在内存中的数据库状态以快照的形式写入到磁盘文件中。子进程通过操作系统的写时复制(Copy - On - Write,COW)机制来共享主进程的内存数据,在生成RDB文件过程中,主进程修改的数据不会影响子进程对数据的读取。
- 触发机制:
- 优点:
- 紧凑高效:RDB文件是一个紧凑的二进制文件,对于数据恢复非常高效。它适合用于备份和灾难恢复场景,因为可以直接将RDB文件拷贝到其他服务器来恢复数据。
- 性能影响小:使用BGSAVE时,主进程可以继续处理请求,只有在fork子进程时会有短暂的阻塞,对Redis性能影响相对较小。
- 适合大规模数据恢复:在数据量较大时,恢复速度比AOF快。
- 缺点:
- 数据丢失风险:由于是定期快照,在两次快照之间如果发生故障,可能会丢失这段时间内的数据。例如,设置900秒触发一次快照,若在899秒时发生故障,这899秒内的数据将会丢失。
- fork开销:fork子进程时需要消耗一定的内存和CPU资源,尤其是在数据集较大时,可能会对服务器性能产生短暂影响。
- 适用场景:
- 对数据完整性要求不是非常高:例如缓存场景,允许部分数据丢失,更注重恢复速度和效率。
- 大规模数据恢复:如数据仓库等场景,数据量较大,需要快速恢复数据。
AOF(Append - Only File)
- 工作原理:
- 日志记录:以日志的形式记录Redis服务器接收到的每一个写操作命令(除了查询命令)。当Redis重启时,会重新执行AOF文件中的命令来恢复数据库状态。
- 写入策略:
- always:每个写命令都立即同步到AOF文件,保证数据不丢失,但性能较低,因为每次写操作都需要进行磁盘I/O。
- everysec:每秒将缓冲区中的写命令同步到AOF文件,这是默认策略。在性能和数据安全性之间做了较好的平衡,即使系统崩溃,最多丢失1秒的数据。
- no:由操作系统决定何时将缓冲区中的数据写入磁盘,性能最高,但数据丢失风险也最大。
- 重写机制:随着写操作不断进行,AOF文件会越来越大。为了解决这个问题,Redis提供了AOF重写机制。分为手动重写(BGREWRITEAOF命令)和自动重写(在redis.conf中配置
auto - aof - rewrite - min - size
和auto - aof - rewrite - percentage
两个参数来控制)。重写过程会创建一个新的AOF文件,将原AOF文件中可以合并的命令进行合并,以达到压缩AOF文件的目的。
- 优点:
- 数据完整性好:采用always或everysec写入策略时,能保证数据的高可用性,数据丢失风险较小。
- 可读性强:AOF文件内容是文本格式的命令,便于理解和分析。
- 缺点:
- 文件体积大:由于记录每一个写操作,AOF文件会比RDB文件大很多,尤其是在频繁写操作的情况下。
- 恢复速度慢:因为恢复时需要重新执行AOF文件中的所有命令,所以在数据量较大时,恢复速度比RDB慢。
- 兼容性问题:由于AOF文件记录的是命令,在Redis版本升级或命令语法变化时,可能存在兼容性问题。
- 适用场景:
- 对数据完整性和一致性要求极高:如金融交易系统等场景,不允许丢失任何数据。
- 写入操作频繁:在这种情况下,AOF的重写机制能够在一定程度上控制文件大小,同时保证数据的安全性。