文章目录

  • 前言
  • Redis的持久化
  • 快照(RDB)和只追加文件(AOF)
  • Redis 持久化的自由搭配
  • 快照持久化
  • 快照持久化的用途
  • 快照内容不保证包含全部信息
  • 快照文件的位置和格式
  • 创建快照的几种方式
  • Redis 通过 SAVE 命令
  • Redis 通过 BGSAVE 命令
  • 手动触发优先选择 SAVE
  • 设置 save 配置选项
  • Redis 收到 SHUTDOWN 或 标准 TERM 信号
  • Redis通过SYNC复制另一台Redis


前言

体能状态先于精神状态,习惯先于决心,聚焦先于喜好。

Redis的持久化

作为非关系型数据库,Redis的一大优势就是支持数据持久化,这样就不会
像Memcache一样,一旦重启,内存中保存的数据就完全消失了。
那么 Redis 的持久化机制是怎样的呢?这正是本文所介绍的内容。

快照(RDB)和只追加文件(AOF)

Redis 提供了两种持久化方式:
快照:按照约定规则,在某一刻将所有数据备份到硬盘。
AOF:append-only file,只追加文件,在Redis执行命令时,将执行的写命令复
制到硬盘里面。

Redis 持久化的自由搭配

Redis 允许你不使用持久化功能,也允许你搭配使用 快照和AOF 中的一种或两种。
默认情况下,Redis 使用快照持久化-你可以从 redis.conf 中 SNAPSHOTTING 关键字查看具体内容。
如果你同时使用了 AOF和RDB,那么在重启Redis的时候,Redis会用 AOF 的文件进行恢复工作。

快照持久化

快照持久化的用途

第一个就是备份。
第二个就是可以将数据复制到其他机器上,创建服务器副本。
第三个就是为了在重启机器后重复使用原来的数据。

快照内容不保证包含全部信息

快照在某一个条件达成或手动触发,在快照文件生成之后,如有Redis有新的操作改变了内容信息,然后Redis、系统或硬件之一发生了崩溃,根据最近的快照恢复后,快照文件生成之后的变更信息将会丢失。

快照文件的位置和格式

在 redis.conf 文件你可以看到快照的目录位置,默认是在Redis安装目录下。
文件名字是 dump.rdb

# The filename where to dump the DB
dbfilename dump.rdb
创建快照的几种方式
Redis 通过 SAVE 命令

SAVE 命令会阻塞Redis,这个命令很少被使用,因为在该命令执行期间,Redis不会响应任何新的命令。
一般在 内存不够支持 BGSAVE 的子进程操作或者手动触发的时候会应用

Redis 通过 BGSAVE 命令

Redis 调用 fork 创建子进程进行快照工作,而父进程继续处理命令请求。
看起来没有阻塞Redis是吧,其实创建子进程的过程会阻塞Redis,而且随着Redis内存的增加,比如20G,根据平台特性的不同,阻塞时间可能超过200~400毫秒或4~6秒。
如果你的Redis内存占用很大,不建议使用自动快照,而是手动触发并且使用SAVE命令。
子进程需要额外的内存哦。

手动触发优先选择 SAVE

在一台 68 内存 的 Xen 虚拟机上,对一个占用50G内存的服务器执行BGSAVE命令,创建子进程需15秒,生成快照文件需 15~20分钟。使用SAVE 只需 3 ~5分钟。
所以在数据量很大时应该手动触发快照生成,并且选择 SAVE 命令。

设置 save 配置选项

自 redis.conf,比如 save 60 10000 表示“从Redis第一次创建快照开始,60秒内有10000次写入“时就会触发 BGSAVE 命令。
可以设置多个这样的命令。

################################ SNAPSHOTTING  ################################
#
# Save the DB on disk:
#
#   save <seconds> <changes>
#
#   Will save the DB if both the given number of seconds and the given
#   number of write operations against the DB occurred.
#
#   In the example below the behaviour will be to save:
#   after 900 sec (15 min) if at least 1 key changed
#   after 300 sec (5 min) if at least 10 keys changed
#   after 60 sec if at least 10000 keys changed
#
#   Note: you can disable saving completely by commenting out all "save" lines.
#
#   It is also possible to remove all the previously configured save
#   points by adding a save directive with a single empty string argument
#   like in the following example:
#
#   save ""

save 900 1     
save 300 10
save 60 10000
Redis 收到 SHUTDOWN 或 标准 TERM 信号

触发 SAVE 命令,阻塞所有客户端,不再执行客户端发送的任何命令,并在 SAVE 命令执行完毕之后关闭服务器。

Redis通过SYNC复制另一台Redis

该操作是Redis服务器连接后的复制操作。
如果主服务器目前没有再执行BGSAVE操作,或者主服务器刚执行完BGSAVE操作,那么主服务器就会执行BGSAVE命令。