1.RDB(Redis DataBase)
什么是RDB?
在指定的时间间隔内,将内存中的数据写入到磁盘中来实现持久化功能。恢复时,将磁盘中的rdb文件写入到内存中来实现恢复。相当于一个快照的功能
RDB的过程
会fork一个子进程来执行RDB持久化的过程,在对数据添加修改时,会将数据先写入到一个临时的rdb文件中,当完成持久化过程后,会将这个临时文件替换掉原来的磁盘内的rdb文件。在这个过程中,父进程只负责处理redis的一些操作,不涉及IO操作,只有子进程来进行IO操作
RDB的时间间隔和触发机制
1.在redis的配置文件中修改
save 900 1 # 每900秒只要修改一次,就进行持久化操作
save 300 10 # 每300秒10次,进行持久化操作
save 60 10000 # 每60秒10000次,进行持久化操作
2、执行 flushall 命令,也会触发rdb
3、退出redis,也会产生 rdb
RDB的优缺点
优点
- 数据量大的时候,恢复数据时会比AOF更快
- 因为父进程不进行IO操作,所以他能最大化redis的工作性能
缺点
- 保存的数据完整性不高,因为他有一个时间间隔的机制,当最后一次还没有达成这个保存条件时,服务器宕机了,就会导致最后的数据丢失
- 在创建子进程的时候,很占用一定的内容空间
2.AOF(Append Only File)
什么是AOF?
AOF是用日志的方式来记录下来所有的操作记录,不记录读取的操作。redis启动的时候,会读取aof文件然后从上往下的顺序来执行记录的操作命令
AOF的过程
父进程会按照配置文件中的aof规则将所有的操作命令(不包括读操作)追加写入aof文件中,下面流程图包括了AOF重写的操作
AOF的配置
appendonly yes #是否开启AOF
appendfilename "appendonly.aof" #默认的aof文件的名字
appendfsync always #每次操作都会追加写入aof文件,每次都会同步,效率低
appendfsync everysec #每一秒会追加写入aof文件,每秒同步,可能会丢失一秒
appendfsync no #不同步写入,操作系统自己同步数据,速度最快
AOF的重写
随着越来越多的操作,导致文件越来越大,会影响服务器正常运行,恢复数据也会更慢,这时候就需要一个重写操作。
文件重写是指定期重写AOF文件,减小AOF文件的体积。需要注意的是,AOF重写是把Redis进程内的数据转化为写命令,同步到新的AOF文件;不会对旧的AOF文件进行任何读取、写入操作!
重写来减小文件的大小的手段主要有两点:
- 去除过期的数据
- 去除一些无效的命令,例如重复的命令,删除了某些数据,单独的get合并成mget指令,等等
文件重写的流程,有两点需要特别注意:
- 重写由父进程fork子进程进行;
- 重写期间Redis执行的写命令,需要追加到新的AOF文件中,为此Redis引入了一个重写缓存。
重写的触发条件
在配置文件中进行配置,同时满足这两个条件时,才会进行重写操作
auto-aof-rewrite-percentage 100 #执行AOF重写时,当前AOF大小和上一次重写时AOF大小的比值。
auto-aof-rewrite-min-size 64mb #执行AOF重写时,文件的最小体积,默认值为64MB。
AOF的优缺点
优点
- 有多种持久化策略,数据完整性会比较高
- AOF日志文件过大的时候,后台会进行重写操作,也不会影响客户端的读写。
- 误删操作能够紧急恢复
缺点
- 大量数据恢复时,由于是通过命令恢复,所以比rdb方式慢
- aof运行效率比较慢,所以Redis默认是rdb方式