RDB
通过快照(snapshotting)完成,当出现以下几种情况时,进行快照:
- 根据配置自动进行,在redis.conf中save部分
- 用户执行save(同步快照,会阻塞所有客户端请求)或bgsave(异步快照)
- 执行flushall(前提是必须定义自动快照条件,否则即使执行,也不会进行快照)
- 执行复制(replication),主从模式,在复制初始化时进行。
快照原理
默认快照文件存储在redis当前进程的工作目录中的dump.rdb文件中,通过redis-cli启动客户端时,文件在redis-cli所在的文件夹中。
使用fork函数赋值一份当前进程(父进程)的副本(子进程)。父进程继续接受并处理客户端的请求,而子进程开始将内存中的数据写入硬盘中的临时文件。写入所有数据后会用改临时文件替换旧的RDB文件,至此完成一次快照操作。
fork的时候,会使用写时赋值策略(copy-on-write),开始时共享内存,当父进程需要更改数据时,操作系统会将该数据复制一份保证子进程的数据不受影响,所以RDB文件存储的是执行fork时刻的内存数据。
AOF
append only file,默认情况下不开启,可通过appendonly yes参数启用。每执行一条会更改redis数据的命令,redis就会将该命令写入磁盘中的aof文件。aof文件的位置和rdb文件的位置相同。
以纯文本形式记录了redis执行的写命令。每当达到一定条件时redis就会自动重写aof文件,去除文件中冗余的数据。
同步硬盘数据
由于操作系统缓存机制,数据并没有真正地写入硬盘,而是进入系统的硬盘缓存。默认情况下每30s执行一次同步操作,将缓存中的内容真正写入硬盘。
appendfsync always 每次操作都同步
appendfsync everysec 没个若干秒同步;这是兼顾性能和安全的考虑。
appendfsync no 不同步,由操作系统决定,即30s