1. 什么是redis持久化机制?
说白了,就是在指定的时间间隔内,将内存当中的数据集快照写入磁盘,它恢复时是将快照文件直接读到内存。什么意思呢?我们都知道,内存当中的数据,如果我们一断电,那么数据必然会丢失,但是玩过redis的同学应该都知道,我们一关机之后再启动的时候数据是还在的,所以它必然是在redis启动的时候重新去加载了持久化的文件
redis提供两种方式进行持久化,一种是RDB持久化默认,另外一种是AOF(append only file)持久化
一.RDB
1. RDB是什么?
原理是redis会单独创建(fork)一个与当前进程一模一样的子进程来进行持久化,这个子进程的所有数据(变量。环境变量,程序程序计数器等)都和原进程一模一样,会先将数据写入到一个临时文件中,待持久化结束了,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程不进行任何的io操作,这就确保了极高的性能。
2. 为什么要fork一个子进程?
因为redis是单线程的,如果这个线程去进行rdb持久化了,那么此时有客户端向我们服务端发送命令,他是得不到处理的(唯一的线程在做持久化),必须要等持久化结束后才能接受客户端命令。那么这个过程可以理解为客户端发送命令会阻塞,性能低下。
3. 这个持久化文件在哪里?
根据redis.conf里的dir配置
4. 他什么时候fork子进程,或者什么时候触发rdb持久化机制?
shutdown时,如果没有开启aof,会触发
执行命令save或者bgsave
bgsave:会fork子进程,原理与rdb上面原理一样,系统默认触发rdb持久化都是调用的此命令
save:是不会fork子进程的,它使用主进程进行持久化,所以会导致客户端命令发送到我们服务端得不到及时处理,所以他是阻塞的
二.aof
1. aof原理?
原理是将Reids的操作日志以追加的方式写入文件,读操作是不记录的,整体分为三步
数据写入内存--》数据写入aof_buf---》写入持久化文件。第二步到第三步什么时候执行根据配置文件触发机制
注意:aof持久化不会fork子进程 |
2. 这个持久化文件在哪里?
根据redis.conf里的dir配置
3. 触发机制(根据配置文件配置项)
no:表示等操作系统进行数据缓存同步到磁盘(快,持久化没保证)
always:同步持久化,每次发生数据变更时,立即记录到磁盘(慢,安全)
everysec:表示每秒同步一次(默认值,很快,但可能会丢失一秒以内的数据)
4. aof重写机制
i 为什么会出现重写?
aof是以日志追加的方式将命令字符串协议保存在aof 文件中,随着我们使用redis的时间越长,最redis的操作越多,这个aof文件会越来越大,如果不做处理,总有会撑爆磁盘,所以就出现了重写,重写就是专门给aof文件廋身的
他的思想是:直接根据现在内存的数据,生成新的aof文件,然后去替换旧的aof文件,就可以把一下没用字符去掉,比如set k1 v1 ,然后我们del k1等等一些没用操作,这样我们的文件大小就会小很多
ii 触发机制?
当AOF文件增长到一定大小的时候Redis能够调用 bgrewriteaof对日志文件进行重写 。当AOF文件大小的增长率大于该配置项时自动开启重写(这里指超过原大小的100%)。
auto-aof-rewrite-percentage 100
当AOF文件增长到一定大小的时候Redis能够调用 bgrewriteaof对日志文件进行重写 。当AOF文件大小大于该配置项时自动开启重写
auto-aof-rewrite-min-size 64mb
注意:重写操作是通过fork子进程来完成的,所以正常的aof不会fork子进程,触发了重写才会 |
rdb 适合大规模的数据恢复,对数据完整性和一致性不高,在一定间隔时间做一次备份,如果redis意外down机的话,就会丢失最后一次快照后的所有操作 aof 根据配置项而定,如果是默认配置,不会丢失超过两秒的数据