Redis提供了两种不同形式地持久化方式。
1.RDB(Redis DataBase)
2.AOF(Append Only File)
RDB:在指定地时间间隔内,将内存中的数据集快照,写入磁盘,也就是Snapshot快照,它恢复时是将快照文件直接读到内存里。
Redis会单独创建(fork)一个子进行来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程时不进行任何IO操作地,这就确保了极高地性能,如果需要进行大规模地数据恢复,且对于数据恢复地完整性不是非常敏感,那RDB方式要比AOF方式更加地高效,RDB缺点是最后一次持久化后地数据可能丢失。
默认备份文件名字:dump.rdb。
dump.db文件
在redis.conf配置文件中
dbfilename
dir
stop-writes-on-bgsave-error
rdbcompression
dbfilename dump.rdb // 默认备份文件名叫dump.rdb
...
dir ./ //dump存放的文件目录,默认放在启动目录中
...
//如果硬盘满了,yes则不再写入,关闭写入操作
stop-writes-on-bgsave-error yes(|no)
...
//是否启动压缩,yes压缩
rdbcompression yes(|no)
//完整性检查,yes检查,在存储快照后,可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗。
rdbchecksum yes(|no)
save 默认是注释掉的。
格式 save 秒钟 写操作次数
save 配置是一个非常重要的配置,它配置了 redis 服务器在什么情况下自动触发 bgsave 异步 RDB 备份文件生成。
RDB是整个内存的压缩过的Snapshot,RDB的数据结构,可以配置复合的快照触发条件。
默认是1分钟内改了1万次,或者5分钟内改了10此,或者15分钟内改了一次。
禁用
不设置save指令,或者给save传入空字符串。
save <seconds> <changes>
save:save时只管保存,其他不管,全部阻塞,手动保存,不建议
bgsave:Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。
可以通过lastsave 命令获取最后一次成功执行快照的时间。
优势:
1.适合大规模的数据恢复
2.对数据完整性和一致性要求不高更适合使用
3.节省磁盘空间
4.恢复速度快
劣势:
1.fork的时候,内存中的数据被克隆了一份,大致两倍的膨胀性需要考虑
2.虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能。
3.在备份周期在一定间隔时间做一次备份,所以如果Redis意外down掉的话,就会丢失最后一次快照后的所有修改。
动态停止RDB,
save后给空值,表示禁用保存策略
redis-cli config set svae ""
以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来(读操作不记录),只允追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据。意思就是:redis启动的话会根据日志文件的内容将写指令从前到后执行一次,以完成数据的恢复工作。
RDB默认开启,AOF默认不开启,
可以在配置文件中,名称默认位 appendonly.aof。
AOF文件的保存路径,同RDB的路径一致。
//改为yes,则开启
appendonly no
..
//文件名appendonly.aof,也可以修改
appendfilename ‘appendonly.aof’
在配置文件中可以配置。
appendfsync always
始终同步,每次Redis的写入都会立刻记入日志;性能较差但数据完整性比较好
appendfsync everysec :每秒同步,每秒计入日志一次,如果宕机,本秒的数据可能丢失
appendfsync no:redis不主动进行同步,把同步时机交给操作系统
重写压缩操作:AOF采用文件追加方式,文件会越来越大,为避免出现这种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof
AOF文件持续增长过大时,会fork出一条新进程来将文件重写(也是先写临时文件,最后再rename),redis4.0版本后的重写,是指把rdb的快照,以二进制的形式附再新的aof头部,作为已有的历史数据,替换掉原来的流水账操作。
no-appendfsync-rewrite
AOF文件大于等于64M,并且并且大于等于64M的100%,128M时才会重写。
1.bgrewriteaof触发重写,判断是否当前有bgsave或bgrewriteaof在运行,如果有,则等待该命令结束后再继续执行。
2.主进程fork出子进程执行重写操作,保证主进程不会阻塞
3.子进程遍历redis内存中数据到临时文件,客户端的写请求同时写入aof_buf缓冲区和aof_rewrite_aof重写缓冲区,保证原AOF文件完整,以及新AOF文件生成期间的新的数据修改动作不会丢失。
4.1 子进程写完新的AOF文件后,向主进程发信号,父进程更新统计信息,
4.2主进程把aof_rewrite_buf中的数据写入到新的AOF文件。
5. 使用心得AOF文件覆盖旧的AOF文件,完成AOF重写。
1.客户端的请求写命令会被append追加到AOF缓冲区内
2.AOF缓冲区根据AOF持久化策略【always,everysec、no】将操作sync同步到磁盘的AOF文件中
3.AOF文件大小超过重写策略或者手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量
4.Redis重启时,会重新load加载AOF文件中写操作达到数据恢复的目的
优:
1.数据完整性更高
2.可读的日志文本,通过操作AOF稳健,可以处理误操作,并且文件损害可恢复
劣:
1.比起RDB占用更多的磁盘空间
2.恢复备份速度慢
3.每次读写都同步的话,会一定的性能压力
4.存在个别BUG,造成恢复不成功
官方推荐两个都启用。
如果对数据不敏感,可以选单独用RDB
不建议单独用AOF,因为可能出现BUG
如果只是做纯内存缓存,可以都不用。