redis持久化的一些小知识

116 阅读6分钟

什么是redis的持久化?

redis为什么会查询这么快,是因为它是作为一种缓存数据库,将数据存储在内存中,不像Mysql,Mysql将数据存储在磁盘中,每次读取都会消耗磁盘IO,所以读效率比较慢,但是redis不同,读缓存的效率是更快的;但是有一个问题,写入磁盘的数据是持久化的,写入内存的数据是不具备持久化的,服务重启的时候数据就会丢失,那怎么保证数据重启不丢失呢,这就需要用到redis的持久化机制

redis有哪些持久化机制?

1)RDB持久化 2)AOF持久化

两种持久化机制的区别?

1)RDB持久化:RDB持久化是将某个时间点上redis中的数据保存到RDB文件中,Redis通过两个命令来创建RDB文件的,一个是SAVE,一个是BGSAVE。

SAVE命令会阻塞redis进程,直到RDB创建文件完毕为止,在服务器进程阻塞的过程中,服务器不能处理其他命令

BGSAVE会派生一个子进程,由子进程负责创建RDB文件,服务器继续进行处理命令请求

可以通过save选项设置多个保存条件,只要其中一个条件满足时,服务器就会执行BGSAVE命令

载入RDB文件:

载入RDB文件是为了在redis服务器进程重新启动之后还原之前存储在redis数据,redis载入RDB文件没有专有的命令,而是在redis服务器启动的时候自动执行的,而且,redis服务器启动时是否会载入RDB文件还取决于服务器是否启动了AOF持久化功能,具体判断逻辑如下:

1)只有在AOF持久化功能关闭的情况下,服务器才会使用RDB文件来还原数据

2)如果服务器开启了AOF持久化功能,那么服务器优先使用AOF来还原数据

服务器在载入RDB文件期间,会一直处于阻塞状态,直到RDB文件载入成功

AOF持久化:

AOF持久化是通过保存redis服务器所执行的写命令来记录数据库数据库,当AOF持久化功能打开时,redis服务器会在执行完一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的AOF缓冲区的末尾,然后redis服务器会根据配置文件中的appendfsync选项的值来决定何时将AOF缓冲区中的内容写入和同步到AOF文件中

appendfsync有三个值:

1)always:从安全性来说,always是最安全的(丢失数据是最少的),因为即使出现故障停机,数据库也只是会丢失一个事件循环中所产生的命令数据,从效率来看,always的效率是最慢的,因为服务器的每个事件循环都要将AOF缓冲区中的所有内容写入到AOF文件中,并且同步AOF文件

2)everysec:从安全性来说,everysec模式下,即使出现故障停机,数据库只会丢失一秒的命令数据,从效率来看,everysec模式足够快,因为服务器在每个事件循环都要将AOF缓冲区中所有内容写入到AOF文件中,并且每个一秒就要在子进程对AOF文件进行同步

3)no:从安全性来说,no模式下,如果出现故障停机,数据库会丢失上次同步AOF文件之后的所有写命令数据,具有不确定性,因为服务器在每个事件循环都要将AOF缓冲区中的所有内容写入到AOF文件中,至于何时对AOF文件进行同步,则由操作系统控制

no和everysec效率差不多,appendfsync选项的默认值是everysec,推荐使用这个值,保证了效率也保证了安全性

redis服务器只需要读入并重新执行一遍AOF文件中保存的写命令,就可以还原redis服务器关闭之前的数据

1)创建一个不带网络连接客户端

2)从AOF文件中分析并读取出一条写命令

3)使用伪客户端执行被读取出来的写命令

4)一直执行步骤2和3,直到AOF文件中的所有写命令都执行完毕

AOF重写:

AOF持久化是通过保存被执行的写命令来记录数据库数据的,所以随着redis服务器运行时间的增加,AOF文件的内容会越来越多,文件的体积会越来越大

AOF重写原理:首先从数据库中读取键现在的值,然后用一条命令来记录键值对,代替之前记录这个键值对的多条命令

AOF后台重写:

redis将AOF文件重写放入到子进程中,子进程进行AOF文件重写期间,服务器进程可以继续进行处理命令请求,子进程带有服务器的数据副本,使用子进程而不是线程,可以避免使用锁的情况下,保证数据的安全性。具体流程如下:

1)服务器创建子进程,子进程开始进行AOF文件重写

2)从创建子进程开始,服务器进程执行的所有写命令不仅要写入到AOF缓冲区,还要写入到AOF重写缓冲区

3)子进程完成AOF重写工作,向父进程发送一个信号,父进程在接收到信号后,会执行以下操作: (1)将AOF重写缓冲区中的所有内容写入到新的AOF文件,这样就保证了新的AOF文件所保存的数据库和服务器当前的数据库数据是一致的 (2)将新的AOF文件进行改名,原子地覆盖现有的AOF文件,完成新旧两个AOF文件的替换

RDB和AOF的区别

1)实现方式:RDB是通过将某个时间点的redis服务器存储的数据保存到RDB文件中,AOF是将redis服务器中所有执行的写命令保存到AOF文件中实现持久化的

2)文件体积:AOF文件体积比较大

3)安全性:AOF持久化的安全性比RDB安全性高,如果机器发生故障,AOF丢失的数据比RDB要少

4)优先级:AOF优先级比RDB高