因为Redis是内存数据库,他将数据库状态存储在内存里面,所以如果一旦服务器进程退出,那么服务器中的数据库状态也会消失不见。
RDB持久化
Redis提供了RDB持久化功能,将数据库状态保存到磁盘里面,避免数据意外丢失。
RDB文件创建有两种模式:被动模式、主动模式。
被动模式
被动模式有用户触发,有两个Redis命令可以用于生成RDB文件
SAVE
SAVE命令会阻塞Redis服务器进程,知道RDB文件创建完毕,在服务器进程阻塞期间,服务器不能处理任何命令请求
BGSAVE
- BGSAVE命令会派生出一个子进程,然后又子进程负责创建RDB文件
- 在BGSAVE命令执行期间,客户端发送的SAVE命令会被拒绝。
- 在BGSAVE命令执行期间,客户端发送的BGSAVE命令会被拒绝。
- 在BGSAVE命令执行期间,BGREWRITEAOF命令会被延迟到BGSAVE命令执行完毕后执行。
- 如果BGREWRITEAOF命令正在执行,那么BGSAVE命令会被服务器拒绝。
主动模式
用户可以通过配置服务器的save选项,让服务器每个一段时间执行一次BGSAVE命令。
save <time> <cnt>
表示服务器在<time>秒内,对数据可进行了至少 <cnt>次修改,则会触发一次BGSAVE命令。
服务器在载入RDB文件期间,会一直处于阻塞状态,知道字啊如工作完毕为止。
AOF持久化
AOF持久化是通过保存Redis服务器执行的写命令来记录数据库状态的。
客户端 —(发送写明令)—> 服务器 —(保存被执行的谢明令)—> AOF文件
AOF持久化的实现
1、命令追加
当AOF功能处于打开状态时,服务器在执行完一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的末尾。
2、AOF文件的写入
服务器配置的appendfsync选项来决定内容写入和保存吧到AOF文件的时机。
appendfsync选项值 | 行为 |
---|---|
always | 将缓冲区的所有内容写入并同步到AOF文件 |
everysec(默认选项) | 将缓冲区中的所有内容写入到AOF文件中,如果上次同步AOF文件的时候距离现在超过1秒钟, 那么再次对AOF文件进行同步,并且这个同步操作是有一个线程专门负责 |
no | 将缓冲区的所有内容写入到AOF,但并不对AOF文件进行同步,何时同步由操作系统来决定 |
AOF文件的载入与数据还原
1、创建一个不带网络连接的为客户端。
2、从AOF文件中分析并读取一条写明令。
3、使用伪客户端执行被读出的写明令。
4、重复执行2-3步,直到AOF文件中的所有命令都被处理完毕。
AOF重写
AOF持久化是通过保存写命令记录数据库状态,AOF文件中的内容会越来越多,如果不加以控制,过大的AOF文件会对Redis宿主机造成影响,且还原数据所需要的时间也会很久。为了解决这个问题,Redis提供了AOF重写功能。通过该功能,Redis服务器创建一个新的AOF文件替代现有的AOF文件,新旧两个文件保存的数据库状态相同,但是新的AOF文件不会包含任何浪费空间的冗余命令。
服务器直接从数据库中读取数据状态,并简化执行命令。用一条命令去记录键值对替代之前记录这个键值对的多条命令。
Redis服务器排上出一个子进程来执行AOF重写。
子进程进行AOF重写期间,服务器进程可以继续处理命令请求。
子进程带有服务器进程的数据副本,是用子进程而不是线程,可以在避免使用锁的情况下,保证数据的安全性。
子进程执行AOF重写期间,服务器进程需要执行以下三个工作。
1、执行客户端发来的命令。
2、将执行后的写命令追加到AOF缓冲区。
3、将执行后的写命令追加到AOF重写缓冲区。
当子进程完成AOF重写工作之后,他会向父进程发送一个信号,父进程会执行以下工作:
1、将AOF重写缓冲区中的所有内容自恶如到新的AOF文件中。
2、对新的AOF文件进行改名,原子地覆盖现有的AOF文件。
Redis恢复
优先加载AOF,当没有AOF时才加载RDB。当AOF或者RDB存在错误,则加载失败。