Redis的数据存储是基于内存的,所以如果当遇到Redis进程异常退出或者机房断电等突发事件,就会造成数据丢失的问题。为了有效的避免这个问题,就有了Redis持久化的机制。

RDB(快照)

RDB持久化是把当前进程数据生成快照保存到硬盘。

触发方式:

手动触发:

  • save命令(同步):

当前Redis进程阻塞,直到RDB持久化完成为止,持久化内存较大的实例阻塞时间较长,线上环境不建议使用。

  • bgsave命令(异步):

    Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。

自动触发:

  • save m n

自动触发最常见的情况是在配置文件中通过save m n,指定当m秒内发生n次变化时,会触发bgsave。

在 redis.conf 配置文件中的默认配置:

1
2
3
save 900 1:表示900秒内至少由1个值发生变化,则保存
save 300 10:表示300秒内至少由10个值发生变化,则保存
save 60 10000:表示600秒内至少由10000个值发生变化,则保存

关闭RDB持久化

注释掉所有的save行来停用RDB持久化
或使用

1
redis-cli config set save " "

RDB优缺点

  • 优点
  1. RDB是一个紧凑压缩的的文件,保存了Redis 在某个时间点上的数据快照。这种文件非常适合用于进行备份和灾难恢复。
  2. 生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
  3. Redis加载RDB 恢复数据的速度比 AOF 的恢复速度要快。
  • 缺点
  1. RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork操作创建子进程,属于重量级操作,如果不采用压缩算法,频繁执行成本过高
  2. RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式的RDB版本,存在老版本Redis服务无法兼容新版RDB格式的问题(版本不兼容)
  3. 在一定间隔时间做一次备份,所以如果redis意外挂掉的话,就会丢失最后一次快照后的所有修改