Redis持久化主要有RDB持久化和AOF持久化,RDB持久化是通过保存数据库中的键值对来记录数据库状态不同,而AOF持久化则是通过保存Redis服务器所执行的写命令来记录数据库状态。
RDB持久化
介绍
RDB持久化所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据状态。无论发生任何事情,只要RDB文件还存在,Redis服务器就能用它还原数据库的状态,Redis是默认开启RDB持久化服务。
Redis中有SAVE和BGSAVE两个命令来生成RDB文件。其中SAVE命令会阻塞服务器进程,一直到RDB文件创建完毕;BGSAVE则与众不同,该命令会生成一个子进程,然后由子进程负责生成RDB文件,而服务器进程继续执行各种命令请求。
此外,RDB文件的载入与其生成不同,它的载入工作是在服务器启动时自动执行的,Redis并没有专门的载入命令。只要Redis服务器在启动时检测到RDB文件的存在,它就会自行载入RDB文件,无需手动载入。
在RDB持久化过程中,主进程还能继续修改数据吗? 通过问题可知,我们讨论的是通过BGSAVE命令来执行RDB持久化命令的。由于BGSAVE命令是通过创建子进程来执行RDB持久化,因此在RDB持久化过程中,主进程是可以继续修改数据的。具体如何做到,则取决于写时复制技术(Copy-On-Write, COW)。
由于RDB持久化进程是主进程的子进程,因此在创建RDB持久化进程时会发生子进程复制主进程(父进程)的页表,但是此时页表还是指向同一块物理内存。只有在发生修改内存数据时,屋里内存才会被复制一份。也即当主进程(父进程)对这些共享数据只是读操作时,主进程(父进程)与RDB持久化进程互不影响。但是如果主进程(父进程)在对这些共享数据进行写操作时,就会发生写时复制,于是这块数据的物理内存就会被复制一份,然后主线程在这个数据副本进行写操作。同时RDB持久化进程继续把原来的数据写入RDB文件中。
AOF持久化
介绍
AOF持久化不同于RDB持久化,它是通过保存Redis’服务器所执行的写命令来记录数据库状态的。在Redis中AOF持久化是默认不开启的,需要修改Redis的配置文件相关参数。
在AOF持久化中,Redis是先执行写操作命令之后,再将该命令记录到AOF日志中,主要是因为: 1、可以减小额外的开销 先将操作命令追加到AOF日志可能存在语法存在问题而执行失败; 2、不会阻塞写操作命令的执行 只有当写操作执行完毕后才能将写操作追加到AOF日志;
注意 AOF持久化也是存在风险的,它可能存在数据丢失以及阻塞下一个命令的现象(AOF持久化与执行命令都存在与主进程,而不同于RDB持久化还存在子进程的概念)。
|