Redis持久化
Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘中,那么一旦服务器进程退出,服务器的数据库状态也就会消失,所以Redis提供了持久化的功能
持久化流程
- 客户端向服务端发送写操作(数据在客户端的内存中)
- 数据库服务端收到写请求的数据(数据在服务端的内存中)
- 服务端调用write这个系统调用,将数据往磁盘上写(数据在系统内存的缓冲区)
- 操作系统将缓冲区中的数据转移到磁盘控制器上(数据在磁盘缓存中)
- 磁盘控制器将数据写到磁盘的物理介质中(数据真正落到磁盘上)
以上的过程是在理想条件一个正常的保存流程,可能会遇到的故障:
- Redis数据库发生故障,只要在上面的第三步执行完毕,那么就可以持久化保存,剩下的两步由操作系统替我们完成。
- 操作系统发生故障,必须上面5步都完成才可以。
RDB( Redis DataBases)内存快照
RDB是Redis默认的额持久化方式
内存快照指内存中的数据在某一时刻的状态记录,类似于拍照,将瞬间的形象记录下来。
Redis将某一时刻到的数据以文件的形式记录到磁盘上,也就是快照,如果内存宕机了,就可以将磁盘中的快照数据加载到内存,即数据的可靠性得到了保证
Redis提供了两个命令来生成RDB文件,分别save和bgsave
save:在主线程中执行,会导致阻塞
执行完成时候如果存在老的RDB文件,就把新的替代掉旧的。我们的客户端可能都是几万或者是几十万,这种方式显然不可取
bgsave
创建出一个子进程,专门用来写入RDB文件,避免主线程的阻塞,是RDB默认的配置