Redis是基于内存操作,很快,既然Redis在内存工作,但是数据如何保存呢?
在Redis重启的时候,如何把数据恢复,保持一致性,这就涉及Redis的持久化机制了。
Redis的持久化机制有两种:
可以单独使用其中一种或将二者结合使用。
RDB持久化是将当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),保存的文件后缀是.rdb
常见配置:
# Redis默认设置, 表示 900秒内产生1条写入命令就触发一次快照,自动触发 bgsave
save 900 1
save 300 10
save 60 10000
# 如果持久化出错,主进程是否停止写入
stop-writes-on-bgsave-error yes
# 是否压缩,如果开启,则消耗更多的CPU,否则消耗更多硬盘
rdbcompression yes
# 使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗
rdbchecksum yes
# 快照文件名称
dbfilename dump.rdb
# 快照文件保存路径
dir ./
①、save m n:表示m秒内数据集存在n次修改时,自动触发bgsave。
其他参数解释见上。
手动触发有两种方法:
localhost:0>save
"OK"
localhost:0>bgsave
"Background saving started"
localhost:0>lastsave
"1603777804"
很明显bgsave
更适合执行RDB 操作,所以Redis的内部操作,包括自动触发,也是 bgsave
。
RDB bgsave 具体过程如下:
1、Redis服务器接收bgsave
,主线程需要调用系统的 fork()
函数,构建出一个子进程去操作;
2、子线程创建好RDB文件并退出时,向父进程发送一个通知,告知RDB文件创建完毕;
3、父进程接收子进程创建好的RDB文件,bgsave
命令执行结束。
AOF是记录Redis的命令,增量备份。
常见配置:
# 是否开启aof,默认是不开启
appendonly no
# 文件名称
appendfilename "appendonly.aof"
# 同步方式,有三种,默认是 everysec
appendfsync everysec
# aof重写期间是否同步
no-appendfsync-on-rewrite no
# 重写触发配置
# (当前AOF文件大小超过上一次重写的AOF文件大小的百分之多少才会重写)
auto-aof-rewrite-percentage 100
# AOF文件重写需要的尺寸,AOF多大时开启重写
auto-aof-rewrite-min-size 64mb
# 文件重写策略
aof-rewrite-incremental-fsync yes
①appendfsync everysec
的三种模式:
②aof-rewrite-incremental-fsync
:
每次批量写入磁盘的数据量由aof-rewrite-incremental-fsync参数控制,默认为32M,避免单次刷盘数据过多造成硬盘阻塞
aof_buf
缓冲区中。
appendfsync
参数决定。
auto-aof-rewrite-percentage
、auto-aof-rewrite-min-size
两个参数决定。
因为重写后文件会变小。
比如一个value 自增1w次,那AOF就需要记录1w次的操作,如果重写后,就可以直接记录该key的最终set值了。
重写分为:
AOF重写大致过程:
aof_rewrite_buf
中,并根据appendfsync
策略持久化到AOF文件中。
过期的键不会被记录到
AOF
文件中
AOF的持久化也可能会造成阻塞。
fsync 每秒同步一次,假如系统磁盘比较忙,可能就会造成Redis主线程阻塞。
当Redis重新启动时,可以读取快照文件恢复数据。
将备份文件 (dump.rdb
) 或者 (.aof文件
)移动到 redis 安装目录并启动服务即可,redis就会自动加载文件数据至内存了。
RDB恢复又分两种情况:
1)主库master:
2)从库salve:
载入 RDB 时,文件中的所有键都会被载入,当同步进行时,会和Master 保持一致。不过,因为主从服务器在进行数据同步的时候,从服务器的数据库就会被清空,所以一般来说,过期键在载入RDB文件的从服务器也不会造成影响
AOF则不会,过期但并未被删除释放的状态会被正常记录到 AOF
文件中,当过期键发生释放删除时,DEL
也会被同步到 AOF
文件中去。
如果同时开启了RDB和AOF,Redis会优先加载AOF文件,找不到AOF文件才会加载RDB文件。
redis4.0开始 添加了RDB-AOF混合方式,可以通过设置aof-use-rdb-preamble yes
开启。.aof
文件就由.rdb
和.aof
文件组成了。这样加载速度快,同时结合AOF,增量的数据以AOF方式保存了,数据更少的丢失。
参考: