持久化 是 Redis 的一个重要特性,即将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
Redis 持久化方式分为快照方式 RDB(Redis DataBase)和日志方式AOF(Append Only File)。
快照方式(RDB)
RDB 是 Redis 默认的持久化方案。在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中。即在指定目录下生成一个dump.rdb文件。Redis 重启会通过加载dump.rdb文件恢复数据。
RDB 触发条件:save、bgsave、满足条件自动触发。
save
执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘。
redis 127.0.0.1:6379> SAVE
# 保存成功时返回 OK 。
特点:同步,会阻塞主进程,直至保存完成。
bgsave
BGSAVE 命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。
redis 127.0.0.1:6379> BGSAVE
Background saving started
特点:异步,不阻塞主进程,但需要创建 fork子进程,消耗内存。
满足条件自动触发
打开 redis.conf 文件
# save m n // 当m秒内发生n次变化,会出发bgsave。
# save ""
save 900 1
save 300 10
save 60 10000
在 900/300/60 秒之内,如果至少有 1/10/10000 个key发生变化,则dump内存快照。(满足任一个条件都触发 bgsave,默认使用bgsave命令)。
若不想用RDB方案,可以把 save "" 的注释打开,注释下面三个。
其它触发可能
- 全量复制
- debug reload
- shutdown
RDB 其它配置
打开 redis.conf 文件
# 指定本地数据库存放目录
dir "/opt/redis-5.0.5/data"
# 指定本地数据库文件名,默认值为dump.rdb
# 根据save的策略,redis的数据包保存在这个文件中
# 避免文件冲突,使用端口区分
dbfilename dump-6379.rdb
# 是否以压缩的形式写入磁盘,默认 yes
rdbcompression yes
# 是否开启遇到错误停止写入磁盘,默认 yes
stop-writes-on-bgsave-error yes
# 是否开启数据校验 默认 yes
# 尽管增加约10%的性能消耗,但建议开启
rdbchecksum yes
日志方式(AOF)
Redis 默认不开启。它的出现是为了弥补RDB的不足(数据丢失),AOF可以将Redis执行的每一条写命令追加到磁盘文件(appendonly.aof)中,在redis启动时候优先选择从AOF文件恢复数据。
开启 AOF
打开 redis.conf 文件
# 是否开启 AOF 持久化功能,默认 no
appendonly yes
# 持久化AOF文件名称,默认 appendonly.aof
appendfilename "appendonly-6380.aof"
# 同步频率,默认 everysec
# everysec 每秒触发一次持久化
# always 每次写操作都触发
# no 跟随操作系统
appendfsync everysec
AOF 重写
Redis 执行了以下三条命令:
redis 127.0.0.1:6379>set foo bar1
redis 127.0.0.1:6379>set foo bar2
redis 127.0.0.1:6379>set foo bar3
此时AOF文件会记录三条命令,这显然不合理,因为文件中应只保留“set foo bar3”这个最后设置的值,前面的set命令都是多余的。
AOF 重写就是 清除过期的、重复的命令,合并简化多条命令。
重写过程与 bgsave 类似,创建fork子进程,由子进程完成相应的操作。
触发重写
手动触发:客户端执行 bgrewriteaof 命令。
条件触发:通过以下两个配置协作生效
#AOF文件最小重写大小,只有当AOF文件大小大于该值时候才可能重写,4.0默认配置64mb。
auto-aof-rewrite-min-size 64mb
#当前AOF文件大小和最后一次重写后的大小之间的比率等于或者等于指定的增长百分比,如100代表当前AOF文件是上次重写的两倍时候才重写。
auto-aof-rewrite-percentage 100
当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。这里的“一倍”和“64M” 可以通过配置文件修改。
AOF 相关配置
参考 Redis 持久化之 AOF 配置详解,此文章介绍了AOF的全部配置。
RDB vs AOF
命令 | RDB | AOF |
---|---|---|
启动优先级 | 低 | 高 |
体积 | 小 | 大 |
恢复速度 | 快 | 慢 |
数据安全性 | 丢数据 | 根据策略决定 |
轻重 | 重 | 轻 |
RDB的启动优先级低于AOF的启动优先级,在宕机的情况下会优先启动AOF
RDB使用二进制的文件作为快照,所以文件的体积小点,AOF则使用了文件追加的方式,所以文件的提及大一些
RDB的恢复速度快,AOF的恢复速度慢一些
RDB文件dump过程中若出现故障,那么会丢失较多的数据,AOF可以有一秒的数据丢失
RDB的操作相对较重一些,会fork出子线程历来dump文件并将临时文件中的内容刷新到旧文件中
AOF若不是用bg操作,操作还是比较轻的