Redis的持久化
Redis的持久化有RDB和AOF两种机制,两种机制可以同时生效,当两个文件(dump.rdb、appendonly.aof)同时存在时,Redis重启时优先采用AOF方式恢复数据。
RDB(Redis Database)
RDB持久化方式能够在指定的时间间隔能对你的数据(snapshot快照)进行快照存储
- Redis单独创建(fork)(复制,子进程与原进程的所有数据完全一样)一个子进程用于持久化,会将内存中的数据写入临时文件,待持久化过程结束后,再用这个临时文件替换上次持久化好的文件
- dump.rdb
- redis-check-dump
- 主进程不需要IO操作,极大地保证了性能
- 缺点是最后一次持久化的数据可能丢失,fork时会产生两倍的膨胀性。适用场景为数据规模大、对数据完整性要求不高的情景
- 配置:SNAPSHOTTING
AOF(Append Only File)
AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾。Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大
- 以日志的形式来记录每个写操作(类似于MySQL的redo日志)
举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态。
- appendonly.aof
- 仅在断电等特殊情况下可能丢失一秒的数据
- AOF文件的体积更大。AOF文件超过指定大小时,会触发重写机制,Redis会对AOF内容进行压缩。可以使用bgrewriteaof指令保留最小指令集
- 重写机制
AOF文件过大(默认配置为当AOF文件大小是上次rewrite后大小的一倍且大于64MB时触发)时,会fork一条新进程重写文件(先写临时文件再rename)。具体方法为:遍历新进程的内存中数据,每条记录产生一条set语句,并没有读取旧的aof文件。这方面与快照有点类似。
- 可通过redis-check-aof修复aof文件
- 配置:APPEND ONLY MODE
Redis.conf 之 SNAPSHOTTING
save
save <seconds> <changes>
disable:不设置任何save指令,或传入空字符串“”
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
注:shutdown命令和一般情况下的flushall、flushdb命令会导致dump文件立即更新,即删库后最新dump文件恢复后Redis内容为空。因此需要备份历史dump文件。
在Redis终端中使用save
或bgsave
命令强制更新dump文件。
save和bgsave的区别在于bgsave是在后台进行快照的异步处理,快照仍能响应客户端请求
stop-writes-on-bgsave-error
默认为yes,代表持久化过程出错时停止写入
配置为no表示不在乎数据不一致或者有其他应对手段
rdbcompression
对快照的持久化启用LZF压缩算法,默认为yes
rdbchecksum
存储快照时采用CRC64算法进行数据校验,默认为yes
dbfilename&dir
存储文件名,默认为dump.rdb;文件夹,默认为./
Redis.conf 之 APPEND ONLY MODE
appendonly
是否开启aof,默认为no
appendfilename
略
appendfsync
aof策略,默认为everysec。可选always、everysec、no
no: don't fsync, just let the OS flush the data when it wants. Faster.
always: fsync after every write to the append only log . Slow, Safest.
everysec: fsync only one time every second. Compromise.
auto-aof-rewrite-percentage&auto-aof-rewrite-min-size
aof文件重写相关配置,默认配置为100、64mb
no-appendfsync-on-rewrite
重写是是否允许appendfsync,默认为no,可以保证数据安全性