RDB(Redis DataBase)
Redis使用操作系统的多进程 COW(Copy On Write)机制来实现快照持久化。
Redis在持久化时会调用 glibc 的函数
fork
产生一个子进程,快照持久化完全交给子进程来处理,父进程继续处理客户端请求。
-
触发条件
- save满足规则的情况
- 执行FLUSHALL、FLUSHDB
- 退出Redis
-
恢复RDB文件中的数据
只需要将.rdb文件放在指定的目录,Redis启动时会自动加载并恢复其中数据
目录存在位置:
127.0.0.1:6379> config get dir 1) "dir" 2) "/usr/local/bin"
-
应用场景:
- 大规模数据恢复
- 对数据完整性要求不高
-
缺点:
- 每次生成文件时有一定间隔。Redis如果宕机,将会缺失部分数据。
- 生成.rdb文件时需要fork一个子进程,会有一些内存占用。
AOF(Append Only File)
Redis在收到客户端修改指令后,进行参数校验、逻辑处理,如果没问题,就立即将该指令文本存储到AOF日志中。
通常Redis的主节点不会进行持久化操作,持久化操作主要是从节点进行。
-
AOF重写
Redis提供了bgrewriteaof指令用于对AOF日志进行瘦身,其原理就是开辟一个子进程对内存进行遍历,转换成一系列Redis的操作指令,序列化到一个新的AOF日志文件中。
-
fsync
Liunx 的 glibc 提供了
fsync(int fd)
函数可以将指定文件的内容强制从内核缓存中刷到磁盘。只要Redis进程实时调用fsync
函数就可以保证AOF日志不丢失。但是fsync
操作是一个磁盘IO操作,非常慢!