因为是内存数据库reids中有两个持久化数据的方法:
1、RDB(redis databases)相当于快照的一个概念。
2、AOF(append only file)做增量,以日志的形式记录每一条操作数据。
RDB:在数据库中有两个命令
save:执行阻塞时拍摄快照,当执行这个命令后,redis不在接收操作来自客户端的数据,只有当这个命令结束后,才会继续接收处理客户端数据。
bgsave:这个操作能在保持redis正常运行的情况下,拍摄快照。它是创建一个子进程,将父进程的指针复制到子进程,再由子进程映射数据,然后 持久到数据库。创建子进程会使用fork方法,而fork方法继承了一个copy only write,这个的意思是在写数据的时候才会复制。但是这个有时间节点问题,当在8点整执行此命令,保存数据需要一个小时,当到8:50的时候redis挂掉了,name这50分钟期间的数据将会丢失,如果让redis做为缓存的话,这个问题不太要紧,只会造成部分穿透。但是要将redis作为数据库的情况下,就是灾难。由此引入AOF。
AOF:日志文件增量
可在配置文件中开启此模式,会以日志的形式存储起来,有点就是每条命令都会持久化到硬盘中,但是有个缺点,如果运行时间足够长,日志文件足够大的话,redis执行这个文件必然会溢出内存。在4.0版本之前,是对重复数据整合,以达到减少文件大小的一个目的。在4.0之后,RDB和AOF能同时开启,但只会执行AOF恢复,并且RDB会存到日志文件中,AOF作为增量附加到RDB之后。这样就实现了让次文件变小。
如果redis作为数据库会发生IO操作
kernel 读到文件码后 会创建一个buffer缓冲区,当缓冲区打满后,会放一组数据。而对于怎么打满缓冲区,多会flush,由redis配置文件决定。
![](https://i-blog.csdnimg.cn/blog_migrate/f9b9428fe102492f7b1cd901c29e4da6.png)