Redis提供两种持久化方式:一种是默认的RDB持久化方式,另一种是AOF(append only file)持久化方式
一、 RDB
是什么?
RDB是通过创建快照的方式进行持久化,保存某个时间点的全部数据,RDB是Redis默认的持久化方案,原理是Redis会通过单独创建(fork)一个与当前进程一模一样的子进程来进行持久化,这个子进程的所有数据(变量、环境变量、程序计数器等)都和原进程一模一样,会先将数据写入到一个临时文件中,待持久化结束了,再用这个临时文件替换上次持久化好的文件,整个过程冲,主进程不进行任何的io操作,这就确保了极高的性能。
1、持久化文件在哪
启动
redis-server
的目录下
2、什么时候fork子进程,或者什么时候触发 rdb持久化机制
RDB
方式持久化数据是通过 fork
子进程,在子进程中进行数据同步
shutdown时,如果没有开启
aof
,会触发配置文件中默认的快照配置 执行命令save
或者bgsave
save
是只管保存,不管其他,全部阻塞,使用主进程进行持久化bgsave
redis 会在后台异步进行快照操作,同时可以响应客户端的请求
3、优点
存储紧凑,节省内存空间 恢复速度快 适合全量备份,全量复制的场景,经常用于灾难恢复(对数据的完整性和一致性要求较低)
4、缺点
容易丢失数据,两次数据快照备份之间如果出现故障,则会丢失期间产生或修改的数据 通过 fork 子进程对内存快照进行全量备份,频繁执行性能消耗较大
-
手动触发
- save, 在命令行执行save命令,将以同步的方式创建rdb文件保存快照,会阻塞服务器的主进程,生产环境中不要用
- bgsave, 在命令行执行bgsave命令,将通过fork一个子进程以异步的方式创建rdb文件保存快照,除了fork时有阻塞,子进程在创建rdb文件时,主进程可继续处理请求
-
自动触发
- 在redis.conf中配置save m n 定时触发,如save 900 1表示在900s内至少存在一次更新就触发
- 主从复制时,如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点
- 执行debug reload命令重新加载Redis时
- 执行shutdown且没有开启AOF持久化
二、AOF
将Redis的操作日志以追加的方式写入文件,读操作是不记录的
为什么会出现AOF持久化方式
1、这个持久化文件在哪
启动
redis-server
的目录下会生成appendonly.aof
文件
2、触发机制(根据配置文件的配置项–appendfsync)
no: 表示操作系统进行数据缓存同步到磁盘(快,持久化没保证:写满缓冲区才会同步,若在缓冲区未写满前 shutdown 或其他意外关机,则这部分数据会丢失) always: 同步持久化,每次发生数据变更时(增删改操作),立即记录到磁盘(慢,安全) everysec: 表示每秒同步一次(默认值,很快,但可能会丢失1秒的数据)
3、AOF 重写机制
重写 AOF 文件会 fork
子进程去执行,会将内存中的数据写入新的 AOF
文件,并且是以RDB
的方式写入,重写结束后会替代旧的AOF
文件,后续的客户端命令操作又重新以 AOF
的格式写入,redis.conf
中配置触发 AOF
文件重写的文件大小值auto-aof-rewrite-percentage
不宜太小,因为会频繁触发重写
- 触发时机
redis.conf
的配置项auto-aof-rewrite-min-size
默认值是 64mb, 当AOF
文件大小超过这个配置值时会自动开启重写 `。redis.conf
的配置项auto-aof-rewrite-percentage
默认值是100, 当AOF
文件大小的增长率大于配置值时会自动开启重写。
4、优点
保证数据安全
5、缺点
数据恢复慢