1. RDB
<1>说明
说明
RDB:redis data base
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的snapshot快照,他恢复时是将快照文件直接写读到内存
优势
- 适合大规模的数据恢复
- 对数据完整性和一致性要求不高的更适合使用
- 节省磁盘空间
- 恢复速度快
劣势
- Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑
- 虽然Redis在Fork时使用了写时拷贝基数,但是如果数据庞时还是比较消耗性能
- 备份周期在一定间隔时间做一次备份,所以如果Redis意外宕机的话,就会丢失最后一次4. 快照所后所修改的内容
<2>执行过程
Redis会单独创建(fork)一个子进程进行持久化,会先将数据写入到一个临时文件,带持久化过程结束了,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能,如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常铭感,那RDB方式要比AOF方式更加高效。
RDB的缺点是最后一次持久化的数据可能丢失。
<3> RDB配置
1. dbfilename
rdb持久化文件名
2. dir
rdb和AOF持久化文件目录
dir ./ 表示启动redis的目录
3. stop-writes-on-bgsave-error yes
当Redis无法写入硬盘,直接关闭Redis 的写操作,推荐yes
4. rdbcompression yes
对存储到内存的快照,可以设置是否压缩存储,如果yes的话,Redis会进行LZF算法进行压缩。
5. rdbchecksum yes
在存储快照后,还可以让Redis使用CRC64算法进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望取到最大的性能提升,可以关闭此功能。推荐yes。
6. save
格式:save 秒钟 写操作次数
RDB是整个内存压缩过的snapsbot,RDB的数据结构,可以配置符合的快照触发条件
默认是一分钟改了1万次,或者5分钟改了10次,或者15分钟改了1次。
不设置save指令,或者给save传入空字符串
save时只管保存,其他不管,全部阻塞,手动保存,不推荐
bgsave:Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。
可以通过lastsave命令获取最后一次成功执行快照的时间。
<4>Fork
- Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。
- 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,Linux 中引入“写时复制技术”
- 一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。
<5>演示
设置 20秒之内改动三次key ,则进行持久化操作
<6> rdb文件备份,恢复与停止
备份
- 先通过config get dir 查询rdb文件的目录
- 将*.rdb的文件拷贝到其他地方
恢复
- 关闭redis
- 先把备份的文件拷贝到工作目录 cp dump2.rdb dump.rdb
- 启动Redis,备份数据会自动加载
停止
动态停止RDB:redis-cli config set save “” #save 后给空值,表示禁用保存策列
永久停止: 修改redis.conf 文件
2. AOF
<1>说明
1. 说明
- AOF :Append Only File
- AOF默认不开启
- 以日志的形式记录每一个写操作(增量保存),将Redis执行过的所有指令记录下来(读操作不记录),只需追加文件但不可以改写文件,redis启动之初会读取文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写执行从前到后执行一次以完成数据的恢复工作。
- AOF 和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)
2. 优点
备份机制更文件,丢失数据概率耕地
可读的日志文本,通过操作AOF稳健,可以处理误操作。
3. 缺点
比起RDB占用更多的磁盘空间
恢复备份要慢
每次读写都同步的话,有一定性能压力
存在个别bug,造成不能恢复
<2>执行过程
- 客户端的请求写命令会被append追加到AOF缓冲区内
- AOF缓冲区根据AOF持久化策略(always,everysec ,no)将操作sync同步到磁盘的AOF文件中。
- AOF文件大小超过重写策略或者手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量。
- Redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的
<3> AOF配置
1. appentonly
默认不开启
改为yes 是开启
2. appendfilename
可以在redis.conf中配置文件名称 ,默认位appendonly.aof
3. AOF同步频率设置
- appendfsync always
始终通过,每次Redis的写入都会立刻记入日志,性能较差,但是完整性比较好。 - appendfsync everysec
每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。 - appendfsync no
redis不主动进行同步,把同步时机交给操作系统。
<4> AOF启动、备份和恢复
AOF的备份机制和性能虽然和RDB不同,但是备份和恢复的操作同RDB一样,都是拷贝备份文件,需要恢复时再拷贝到Redis工作目录下,启动系统即加载。
启动
- 修改默认的appendonly no 改为yes
备份 - 先通过config get dir 查询aof文件的目录
- 将*.rdb的文件拷贝到其他地方
正常恢复
- 修改默认的appendonly no 改为yes
- 将有数据的aof文件复制一份保存到对应目录(查看目录: config get dir)
异常恢复
-
如果AOF文件损坏,通过user/local/bin/redis-check-aof --fix appendonly.aof进行恢复
-
备份写坏的AOF文件
-
重启redis ,然后重新加载
<5> Rewrite 压缩
-
是什么∶
AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集.可以使用命令 bgrewriteaof。 -
重写原理,如何实现重写
AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename), redis4.0 版本后的重写,是指上就是把 rdb 的快照,以二级制的形式附在新的aof头部,作为已有的历史数据,替换掉原来的流水账操作。" -
开启重写
no-appendfsync-on-rewrite : yes -
触发机制
Redis 会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。
auto-aof-rewrite-percentage :设置重写的基准值,文件达到100%时开始重写(文件是原来重写后文件的2倍时触发),
auto-aof-rewrite-min-size:设置重写的基准值,最小文件64MB。达到这个值开始重写。
I
3. 总结
官方推荐两个都启动
如果对数据不敏感,可以选择单独用RDB
不建议单独用AOF,因为可能会有bug
如果只做纯内存缓存,可以都不用