Redis持久化两种方式—RDB和AOF

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保存数据的过程:

  1. redis会创建(fork)一个子进程来进行持久化。
  2. 父进程继续处理client请求,子进程负责将内存中的内容写入到临时文件。由于OS的写时复制机制(copy on write),父子进程会共享相同的物理页面,当父进程处理写请求时,OS会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数据是fork时整个数据库的一个快照。
  3. 当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出。

整个过程,主进程不进行任何IO操作,确保了极高的性能。如果需要进行大规模数据的回复,且对数据回复的完整性不是非常敏感的话,使用RDB方式要比AOF方式更加高效。

也可以在redis client端执行slave或bgslave(异步)命令手动执行快照持久化。但是注意

  • save操作是在主线程中保存快照,会阻塞所有的client请求
  • 每次快照持久化都是将内存数据完整的写入到磁盘一次,而不是增量同步,如果数据量大,且写操作比较频繁,会引起频繁的IO操作,影响redis性能。

注:

  1. fork 的作用是复制一个与当前进程一样的进程,新锦成的所有数据都和原进程一致,并作为原进程的子进程。
  2. flushall命令也会产生dump.rdb文件,但是文件内容为空
  3. 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相关的配置:

  1. appendonly yes:开启redis AOF功能
  2. appendfilename "appendonly.aof":aof的记录文件名
  3. appendfsync always/everysec/no:aof记录频率,always表示每次收到记录就立即写入磁盘,性能损耗大;everysec表示每秒钟写入磁盘一次,性能和持久化折中;no不同步,完全依赖os,性能好,但持久化没有保证。
  4. no-appendfsync-on-rewrite no:重写时是否可以运用appendfsync,默认no,保证数据安全。
  5. auto-aof-rewrite-percentage 100:设置重写的标准值,即上次文件大小的百分比
  6. auto-aof-rewrite-min-size 64mb:当aof文件最小达到64mb大小时,开始重写aof文件
  7. aof-load-truncated yes:aof文件损坏时,是否自动修复文件。选择no时,需要手动redis-check-aof 修复文件
  8. 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文件进行数据恢复。

发布了74 篇原创文章 · 获赞 19 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/zhoushimiao1990/article/details/99469804