RDB

RDB(Redis DataBase)是 Redis 中默认的持久化机制,将内存中的数据以快照的方式异步保存到磁盘指定目录的.rdb文件中,可以通过配置文件中save参数来定义快照的周期

流程

save

指令执行完成前不执行其他操作,仅用于迁移、维护等数据备份,生产环境谨慎使用

bgsave

指令执行时,Redis 会调用 glibc 的函数 fork 出一个子进程,先将数据写到磁盘上的一个临时 .rdb 文件中,写入完成后再将原来的 .rdb 文件替换掉
COW 机制(copy-on-write)就是保证上述步骤的前提:当主进程执行读操作的时候是访问共享内存的,而主进程执行写操作的时候,则会拷贝一份数据,执行写操作;以此减少分配和复制时带来的瞬时延迟以及不必要的资源分配

优点

  • 只有一个文件 dump.rdb ,按时间点保存数据集,便于备份和恢复
  • 持久化时主进程可以继续处理其他命令,不进行任何 I/O 操作,保证 Redis 的高性能
  • RDB 是一个紧凑压缩的二进制文件,重载效率比 AOF 持久化更高,在数据量大时更明显

    缺点

  • 可能出现数据丢失,在两次 RDB 持久化的时间间隔中,如果出现宕机,则会丢失这段时间中的数据
  • 由于 RDB 是通过 fork 子进程来协助完成数据持久化,当数据集较大时,可能会导致间歇性暂停服务

    AOF

    AOF ,及追加文件(Append Only File),当 Redis 处理每一个写命令都会记录在 AOF 文件中,可以看做是命令日志文件

    流程

    需要设置 AOF 的同步选项,因为对文件进行写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区中,同步选项有三种配置项选择:
    1
    2
    3
    4
    #是否开启,默认 no,开启换为 yes
    appendonly yes
    #同步选项
    appendfsync everysec
  • always:同步记录,可靠性高,I/O 开销大,影响性能较大
  • everysec:每秒同步一次,性能适中,最多丢失 1 秒的数据
  • no:默认配置,即不使用 AOF 持久化,性能最好,可靠性最差

随着 Redis 的运行,AOF 的日志会越来越长,如果实例宕机重启,重载整个 AOF 将会变得十分耗时;为了解决这个问题,Redis 提供 bgrewriteaof 指令,可以将 AOF 文件进行压缩,也可以选择自动触发,在配置文件中配置

1
2
3
no-appendfsync-on-rewrite yes
auto-aof-rewrite-precentage 100
auto-aof-rewrite-min-zise 64mb

优点

实现持久化,数据安全,AOF持久化可以配置 appendfsync 属性为 always,每进行一次命令操作就记录到AOF文件中一次,数据最多丢失一次
通过 append 模式写文件,即使中途服务器宕机,可以通过 Redis-check-aof 工具解决数据一致性问题
AOF 机制的 rewrite 模式。AOF 文件的文件大小触碰到临界点时,rewrite 模式会被运行,重写内存中的所有数据,从而缩小文件体积

缺点

  • AOF 文件大,比 RDB 文件大很多
  • 比 RDB 持久化启动效率低,数据集大时较为明显
  • AOF 文件体积可能迅速变大,需要定期执行重写操作来降低文件体积

    混合

    顾名思义