一、RDB持久化
save
bgsave
save 100 1 执行原理
rdb文件结构
od -cx dump.db 查看格式化的备份文件
重点回顾
RDB文件用于保存和还原Redis服务器所有数据库中的所有键值对数据。
SAVE命令由服务器远程直接执行保存操作,所以该命令会阻塞服务器。
BGSAVE命令由子进程执行保存操作,所以该命令不会阻塞服务器。
服务器状态中会保存所有用save选项设置的保存条件,当任意一个条件被满足时,服务器会自动执行BGSAVE命令。
RDB文件是一个经过压缩的二进制文件,由多个部分组成。
对于不同类型的键值对,RDB文件会使用不同的方式来保存他们。
二、AOF持久化
AOF持久化:通过保存Redis服务器所执行的写命令来记录数据库状态
appendsysnc 三种选项设置 always、everysec、no
2.AOF重写
为解决AOF文件体积膨胀,提供了AOF文件重写功能。不需要对现有AOF文件进行任何分析等操作,通过读取服务器当前的数据库状态来实现。
比如:list 多个add命令,读取现有数据库,合并为一个add命令,同时为了避免输入缓冲区溢出,重写程序在处理列表、哈希表、集合、有序集合时,如果一个集合键超过了设定值,那么会用多条add命令来记录。
使用子进程执行的好处:
子程序执行AOF重写程序, 不影响主进程处理客户端请求;
子进程带有服务器晋城的数据副本,使用子进程而不是线程,可以在避免使用锁的情况,保证数据安全性;
为避免数据不一致性问题,Redis服务器执行完一个写命令后,会同时发送写命令给AOF缓冲区和AOF重写缓冲区。子进程重写完成后,发送信号给父进程,父进程调用一个信号处理函数:将重写缓冲区所有内容写入新的AOF文件,这是新的文件与数据库保持一致,完全替换掉旧的AOF文件,这时候会阻塞父进程不处理任何命令。
重点回顾:
AOF文件通过保存所有修改数据库的写入命令请求来记录服务器到的数据库状态;
AOF文件中所有的命令都以Redis命令请求协议的格式保存;
命令请求会先保存到AOF缓冲区,之后在定期写入并同步到AOF文件。
apendfsync选项的不同值对AOF持久化功能的安全性以及Redis服务器的性能有很大的影响;
服务器只要载入并重新执行保存在AOF文件中的命令,就可以还原数据库本来的状态;
AOF重写可以产生一个新的AOF文件,这个新的AOF文件和原有的AOF文件所保存的数据库状态一样,但体积更小;
AOF重写是一个有歧义的名字,该功能是通过读取数据库中的键值对来实现的,程序无须对现有的AOF文件进行任何读入、分析或者写入操作;
在执行BGREWRITEAOF命令时,Redis服务器会维护一个AOF重写缓冲区,该缓冲区会在子进程创建新AOF 文件期间,记录服务器执行的所有写命令。当子进程完成创建新AOF文件的工作之后,服务器会将重写缓冲去中的所有内容追加到新AOF文件的末尾,新旧两个AOF文件所保存的数据库状态一致。最后,服务器用新的AOF文件替换旧的AOF文件,以此来完成AOF文件重写操作;
三、事件
事件执行图
重点回顾:
Redis服务器是一个事件驱动程序,服务器处理的事件分为时间事件和文件事件两类;
文件事件处理器是基于Reactor模式实现的网络通信程序;
文件事件是对套接字操作的抽象:每次套接字可变为可应答、可写或者可读时,相应的文件事件就会产生;
文件事件分为AE_READABLE事件(读事件)和AE_WRITABLE事件(写事件)两类;
时间事件分为定时事件和周期性事件:定时事件只在指定的时间到达一次,而周期性事件则每隔一段时间到达一次;
服务器一般情况下只执行serverCron函数一个时间事件,并且这个事件是周期性事件;
文件事件和时间事件之间是合作关系,服务器会轮流处理这两种时间,并且处理事件的过程也不会进行抢占;
时间事件的实际处理事件通常会比设定的到达时间晚一些;