1、redis协议
+:表示简单字符串
-:表示错误
::表示整数
$:表示批量字符串
*:表示数组
请求是由批量字符串组成的数组组成
2、aof持久化
当aof持久化功能处于打开状态时,服务器在执行完一个写命令这后,会以协议格式将被执行的命令追加到服务器状态的aof_buf缓冲区的末尾。
在准备睡眠等待事件前都会调用beforeSleep,当中会调用flushAppendOnlyFile函数,考虑是否需要将aof_buf缓冲区中的内容写入和保存到aof文件里。
appendfsync选项值 | flushAppendOnlyFile行为 |
always | 将aof_buf缓冲区中的所有内容写入并同步到aof文件 |
everysec | 将aof_buf缓冲区中的所有内容写入到aof文件,如果上次同步aof文件地时间距离现在超过一秒钟,那么再次对aof文件进行同步,并且这个同步操作是由一个线程专门负责执行的。 |
no | 将aof_buf缓冲区中的所有内容写入到aof文件,但并不对aof文件进行同步,何时同步由操作系统来决定 |
持久化流程图
3、aof的载入
读入并重新执行aof文件里面保存的写命令,可以还原服务器关闭之前的数据库状态
4、aof重写
redis服务器设置了一个aof重写缓冲区,在服务器创建子进程后开始使用,当redis服务器执行完一个写命令之后,它会同时将这个写命令发送给aof缓冲区和aof重写缓冲区。
在子进程执行aof重写期间,服务器进程需要执行以下三个工作
- 执行客户端发来的命令
- 将执行后的写命令追加到aof缓冲区
- 将执行后的写命令追加到aof重写缓冲区
通过上面来保证:aof缓冲区的内容会定期被写入和同步到aof文件,对现有aof文件的清理工作会如常进行。从创建子进程开始,服务器执行的所有写命令都支被记录到aof重写缓冲区里面。
当子进程完成aof重写工作之后,它会向父进程发送一个信号,父进程在接到该信号之后,会调用一个信号处理函数,并执行以下工作:
- 将aof重写缓冲区的所有内容写入到新aof文件中,这时新aof文件所保存的数据库状态将和服务器当前的数据库状态一致。
- 对新的aof文件进行改名,原子地覆盖现有的aof文件,完成新旧两个aof文件的替换。
这个信号处理函数执行完毕之后,父进程就可以像往常一样接受命令请求了。
重写时机
- 手动执行rewriteaof命令