前言
Redis提供了持久化功能,将内存中的数据定期备份或通过命令导出到硬盘上,启动时,若检测到备份文件,会首先从备份文件中恢复数据到内存。
redis提供两种持久化方式:
- 快照:RDB
- 日志(append only file):AOF
快照 RDB
使用方法
通过命令显式地导出
- SAVE:阻塞式,切勿在生产环境使用
- BGSAVE:非阻塞式
- 默认导出到安装目录
- 可通过CONFIG GET dir命令查看安装目录
在.conf文件中配置规则定期备份
- SAVE <seconds> <changes>
- 含义:在seconds秒内,发生了至少changes次修改,则备份一次
- 可以配置多条
- 备份是非阻塞的
默认配置:
1
2
3save 900 1
save 300 10
save 60 10000含义:满足以下三个条件中的任意一个,BGSAVE命令就会被执行:
- 服务器在900秒之内,对数据库进行了至少1次修改
- 服务器在300秒之内,对数据库进行了至少10次修改
- 服务器在60秒之内,对数据库进行了至少10000次修改
时点性
含义:快照的数据就是执行持久化指令时刻的数据,在持久化过程中的数据变化,不会体现到快照中。
实现:
- 阻塞式:停止对外服务
- 非阻塞式:
- redis进程使用fork创建子进程,并将要持久化的数据export给子进程
- 子进程拿到的数据副本,不会随着父进程的修改而改变
- 底层机制是操作系统层面的写时复制机制。父子进程的数据开始时是指向同一块内存的,一旦父子进程的任意一方试图修改数据,就会触发写时复制机制,重新创建一份副本,修改值,并将指针指向新的修改后的副本,这样,修改的值不会影响到另一个进程
弊端
丢失数据的可能性相对较大,时点与时点之间的数据容易丢失
优点
字节流序列化,恢复的速度较快
日志 AOF
AOF持久化将redis的写操作记录到文件中。
使用方法
.conf文件中配置,开启AOF备份:
1 | appendonly yes |
注:redis配置文件中,若同时开启了rdb和aof,两种备份文件都会生产,但只会以AOF恢复。
优点
丢失数据的可能性相对小
弊端
时间长了之后,日志体量过大;
恢复相对较慢
解决方案
重写日志文件:
- redis4.0之前:删除抵消的命令,合并重复的命令,最终仍是一个纯指令文件
- redis4.0之后:先将旧数据以rdb格式存到aof文件中,再将增量数据以指令的格式追加到aof文件中,最终是快照和日志的混合体,利用了rdb的快和aof的全
详细配置
开启AOF:
appendonly yes
AOF文件名:
appendfilename "appendonly.aof"
写磁盘频率:
appendfsync always/everysec/no
- always:每次写完,都flush到磁盘
- everysec:每秒调一次flush,这是默认配置
- no:不主动flush,操作系统的写文件缓冲区满了自动写到磁盘,一般缓冲区4k大小
开启rdb和aof混合模式:
aof-use-rdb-preamble yes
自动重写触发的条件:
auto-aof-rewrite-percentage 100
:当aof文件大小是上一次重写时的aof文件大小的200%时,触发重写auto-aof-rewrite-min-size 64mb
:aof文件小于64mb大小时,不会触发重写