
Redis 持久化
Redis 是在内存中储存数据的,当服务器重启时,所有的数据都将会丢失。为了保证数据的安全,Redis 提供了将数据持久化到磁盘中的机制。Redis 共有两种数据持久化模型:
RDB
和AOF
。
RDB
RBF
方式的持久化是通过快照完成的,当符合一定条件时 Redis 会自动将内存中的所有数据生成一份副本保存在硬盘上,这个过程即为“快照”。Redis 会在以下几种情况下对数据进行快照。
- 根据配置规则进行自动快照。
- 用户执行
SAVE
或BGSAVE
命令 - 执行
FLUSHALL
命令。 - 执行复制时。
根据配置规则进行自动快照。
Redis 允许用户自定义快照条件,当符合快照条件时,Redis 会自动自行快照操作。进行快照的条件可以由用户在配置文件中自定义,由两个参数构成:时间窗口 M 和改动的键的个数 N。每当时间 M 内被更改的键的个数大于 N 时,即符合自动快照条件。
save 900 1 # 在 15 分钟内有一个或一个以上的键被更改则进行快照
save 300 10
save 60 10000
SAVE
或 BGSAVE
SAVE
命令
在执行SAVE
命令时,Redis 同步地进行快照操作,在快照执行的过程中会阻塞所有来自客户端的请求。当数据库中的数据比较多时,这一过程会导致 Redis 较长时间不响应。BGSAVE
命令
需要手动执行快照时推荐使用BGSAVE
命令。BGSAVE
命令可以在后台异步地进行快照操作,快照的同时服务器还可以继续响应来自客户端的请求。
执行 FLUSHALL
命令
当执行 FLUSHALL
命令时,Redis 会清除数据库中的所有数据。当没有定义自动快照条件时,执行 FLUSHALL
则不会进行快照。
执行复制时
当设置了主从模式时,Redis 会在复制初始化时进行自动快照。
快照原理
Redis 默认会将快照文件储存在 Redis 当前进程的工作目录中的 dump,rdb 文件中,可以通过配置 dir
和 dbfilename
两个参数分别指定快照文件的储存路径和文件名。快照的过程如下:
- Redis 使用
fork
函数复制一份当前进程(父进程)的副本(子进程) - 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件。
- 当子进程写入完所有数据后会用该临时文件替换旧的 RDB 文件,至此一次快照操作完成。
AOF
当使用 Redis 储存非临时数据时,一般需要打开 AOF
持久化来降低进程中止导致的数据丢失。AOF
可以将 Redis 执行的每一条写命令追加到硬盘文件中,这一过程虽然会降低 Redis 的性能,但是大部分情况下这个影响是可以接受的。
开启AOF
默认情况下 Redis 没有开启 AOF 方式的持久化,可以通过 appendonly
参数启用。
appendonly yes