Redis的持久化简单来说就是异步的把内存中的数据保存到硬盘上,Redis提供了两种持久化的方式分别是RDB和AOF。
-
RDB
RDB是一种使用快照方式的持久化,它会把当前的数据像拍照一样照下来,生成RDB文件保存到硬盘,是一个整个的形式,而AOF是一种日志式的持久化,每一条更新都会写入AOF。生成的RDB文件在Redis启动时可以载入,恢复数据,并且该RDB文件是一个有自己格式的二进制文件。
RDB有三种触发机制,分别是save,bgsave,通过配置自动触发。
save:
该方法是同步阻塞的,也就是说在Redis生成好RDB文件前是阻塞的,在使用时要注意这一点,此外如果存在老的RDB文件,新文件会替换老文件。
bgsave:
该方法通过fork方法创建一个子进程来实现生成RDB文件的任务,子进程会使用CPU,IO,内存等资源,在单机多部署,或者数据量大等情况时要考虑到bgsave带来的开销和对性能的影响。同样该方法也是新文件会替换旧文件。
配置自动触发:
save 时间(s) 时间内修改的次数
dbfilename 文件名
stop-write-on-bgsave-error yes bgsave发生错误时停止写入
rdb compression yes 采用压缩存储RDB文件
rdb checksum yes 检验和检验
满足上面的时间内发生的修改次数就会触发生成RDB文件,其他的命令是生成RDB过程中的一些设置。
此外还有一些形式能够触发RDB,即使RDB已经被关闭:
1.主从复制时的全量复制,是以RDB的形式实现的
2.debug reload
3.shutdown
-
AOF
AOF是一种以日志的形式来实现持久化的,在AOF文件中记录操作从而保证能够恢复数据,有点像MYSQL中的redo log。
AOF有三种策略,always是每条命令都fsync到硬盘,everysec是每一秒把缓冲区fsync到硬盘,no是由OS来决定什么时候写入AOF文件。但是如果每一条命令都写入文件在某些情况显的没有必要,比如对string类型的键修改值,只要保存最后一条修改记录就可以了,可以让AOF文件简洁,这种形式叫做AOF重写,是对原生的AOF的优化,类似于编译器对代码的优化。使得AOF文件变小,减少硬盘占用量,加快恢复数据的速度。
AOF重写有两种实现方式:bgrewriteaof命令和配置文件中设置实现。
bgrewriteaof:
具体的AOF重写流程:
配置文件设置:
auto_aof_rewrite_min_size :of文件重写需要的尺寸(aof文件多大时才重写)
auto_aof_rewrite_percentage :aof文件增长率(进行一次重写后下一次多大时再重写)
aof_current_size :aof文件当前大小(字节)
aof_base_size :aof上次启动和重写时的大小(字节)
同时满足一下两个条件时会自动进行AOF重写:
aof_current_size>auto_aof_rewrite_min_size
(aof_current_size-aof_base_size)/aof_base_size>auto_aof_rewrite_percentage
此外还有一些参数:
appendfilename 文件名:设置文件名
appendfsync 策略名:设置策略
no_appendfsync_on_rewrite:AOF重写时是否做AOF正常的append操作