Redis提供了两种数据持久化方式:
- RDB:redis的数据存储在内从中,不定期的将数据异步同步到磁盘上(半持久化)
- AOF:记录redis的所有写操作到aof(append only file)文件中(全持久化)
redis中默认使用的事RDB实现数据持久化
RDB: SNAPSHOTING
这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久 化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照,下面是默认的快照保存配置
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000
也可以手动执行save或者bgsave(异步)做快照。
RDB保存数据的过程:
- redis会创建(fork)一个子进程来进行持久化。
- 父进程继续处理client请求,子进程负责将内存中的内容写入到临时文件。由于OS的写时复制机制(copy on write),父子进程会共享相同的物理页面,当父进程处理写请求时,OS会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数据是fork时整个数据库的一个快照。
- 当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出。
整个过程,主进程不进行任何IO操作,确保了极高的性能。如果需要进行大规模数据的回复,且对数据回复的完整性不是非常敏感的话,使用RDB方式要比AOF方式更加高效。
也可以在redis client端执行slave或bgslave(异步)命令手动执行快照持久化。但是注意
- save操作是在主线程中保存快照,会阻塞所有的client请求
- 每次快照持久化都是将内存数据完整的写入到磁盘一次,而不是增量同步,如果数据量大,且写操作比较频繁,会引起频繁的IO操作,影响redis性能。
注:
- fork 的作用是复制一个与当前进程一样的进程,新锦成的所有数据都和原进程一致,并作为原进程的子进程。
- flushall命令也会产生dump.rdb文件,但是文件内容为空
- lastsave命令获取最后一次成功执行快照的时间
RDB相关配置:
RDB相关的配置对应redis.conf中的SNAPSHOT模块
关于这段配置的中文释义可以参考博文:Redis配置文件详解
RDB持久化数据的优缺点:
优势:
- 适合大规模数据恢复
- 对数据完整性和已执行要求不高
劣势:
- 在一定时间间隔内做一次备份,可能会造成最后一次数据丢失
- fork时,内存中的数据被克隆一份,大致2倍的数据膨胀需要考虑
AOF:
AOF以日志的形式来记录每个写操作,将Redis执行过的所有写操作记录下来,只追加文件但不修改文件,redis启动时会读取该文件重新构建数据。即redis重启时会根据日志文件的内容将写指令全部重新执行以恢复数据。
AOF在redis.conf中的配置:
redis中AOF默认是关闭的,修改配置:appendonly yes,即可开启redis的AOF功能,且默认的记录文件为appendonly.aof。
截图中并不包含所有的aof相关配置,下面就来说一下redis.conf中aof相关的配置:
- appendonly yes:开启redis AOF功能
- appendfilename "appendonly.aof":aof的记录文件名
- appendfsync always/everysec/no:aof记录频率,always表示每次收到记录就立即写入磁盘,性能损耗大;everysec表示每秒钟写入磁盘一次,性能和持久化折中;no不同步,完全依赖os,性能好,但持久化没有保证。
- no-appendfsync-on-rewrite no:重写时是否可以运用appendfsync,默认no,保证数据安全。
- auto-aof-rewrite-percentage 100:设置重写的标准值,即上次文件大小的百分比
- auto-aof-rewrite-min-size 64mb:当aof文件最小达到64mb大小时,开始重写aof文件
- aof-load-truncated yes:aof文件损坏时,是否自动修复文件。选择no时,需要手动redis-check-aof 修复文件
- aof-use-rdb-preamble no:重写aof文件时,是否使用RDB序言
AOF LOG Rewrite:
AOF采用文件追加的方式,文件会越来越大。为了避免这种情况,熙增了重写机制,即当AOF文件大小超过指定阀值时,Redis会启动AOF文件的内容压缩,值保留可以恢复数据的最小指令集,也可以使用bgrewriteaof命令,手动压缩文件。
AOF文件持续增长过大时,会fork出一条新锦成来讲文件重写(先写临时文件最后再rename),遍历新锦成的内存中的数据,每条记录有一条的set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个aof文件,这点类似于快照。
redis会记录上次重写的aof文件的大小,默认配置时当aof文件和上次rewrite的文件大小相同,且文件大小大于最小值时,会触发重写机制。对应的配置为:
- auto-aof-rewrite-percentage 100:设置重写的标准值,即上次文件大小的百分比
- auto-aof-rewrite-min-size 64mb:当aof文件最小达到64mb大小时,开始重写aof文件
AOF优缺点:
注意:当同事启用AOF和RDB持久化方案时,redis会先使用aof文件进行数据恢复。