Redis 提供了2个不同形式的持久化方式
RDB(Redis DataBase)
RDB 在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里
RED 是 redis默认的持久化方式(默认开启)
备份是如何执行的
- Redis 会单独创建(fork)一个子进程来进行持久化,会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
Fork
- Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程
- 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,Linux中引入了 写时复制技术
- 一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。
- 在
redis.conf
配置文件中,253
行可以修改rdb
持久化文件的名称
- 在
263
行可以设置持久化备份文件的存放位置
rdb
备份的保存策略
- redis 中执行命令时,如果执行 save (同步)或者 bgsave (异步),也可以触发 redis 使用 rbd 的方式将内存的数据写入到 rdb 文件
- redis正常关闭时,也会自己调用bgsave完成数据的备份
- 如果本次保存后,下一个保存还未开始,如果redis宕机了,会导致时间间隔内的所有的数据丢失
- 如果我们对数据保存的粒度没有太高的要求,推荐使用rdb
- mysql(持久化)+redis(内存存储)
AOF(Append Of File)
将每次的写操作以日志的形式保存到日志文件中(可读的),比较占磁盘空间,保存粒度细,恢复时会将aof文件中的所有的写指令从前到后执行一遍,性能较差。
- 开启aof持久化 , 修改redis配置文件 appendonly no 改为 yes
AOF和 RDB
- 如果都启用,备份时两个都会备份
- 如果redis启动时,优先加载 aof 中的数据( aof 保存数据粒度细,丢失概率小)
- 取消rdb备份:注释掉
#dbfilename ""
AOF备份防止误操作
- AOF 以日志形式保存,所有的写指令都是以增量的方式追加
- 如果有误操作我们可以手动修改aof文件删除误操作
- AOF同步策略
触发机制,何时重写
- Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发
- 重写虽然可以节约大量磁盘空间,减少恢复时间。但是每次重写还是有一定的负担的,因此设定Redis要满足一定条件才会进行重写。
- 系统载入时或者上次重写完毕时,Redis会记录此时AOF大小,设为base_size
- 如果Redis的AOF当前大小>= base_size +base_size*100% (默认)且当前大小>=64mb(默认)的情况下,Redis会对AOF进行重写。
AOF优点:
- 备份机制比较稳健(丢失数据概率小)
- 不用额外备份,可以直接通过aof文件防止误操作
缺点:
- 日志方式保存,占用磁盘空间较多
- redis加载时会从前到后将所有命令都执行一遍,恢复数据时慢
- aof方式保存的粒度细,redis性能压力大
RDB和AOF的选择以及区分:
- 官方推荐如果一定要使用缓存,可以两个都使用
- 如果不考虑数据的丢失问题,可以只使用rdb
- 不推荐单独使用aof,如果要用推荐aof+rdb一起用
- 如果有mysql之类的持久化方式,redis只作为纯内存缓存,可以不开启持久化
感谢阅读, 如果文章对你有帮助记得点赞 收藏 + 关注哦 ! 各种疑难杂症QQ交流群:1101584918,欢迎大家加入。