save数据库
bgsave安全
save 100 1 执行原理服务器
rdb文件结构网络
od -cx dump.db 查看格式化的备份文件app
RDB文件用于保存和还原Redis服务器全部数据库中的全部键值对数据。函数
SAVE命令由服务器远程直接执行保存操做,因此该命令会阻塞服务器。性能
BGSAVE命令由子进程执行保存操做,因此该命令不会阻塞服务器。spa
服务器状态中会保存全部用save选项设置的保存条件,当任意一个条件被知足时,服务器会自动执行BGSAVE命令。线程
RDB文件是一个通过压缩的二进制文件,由多个部分组成。server
对于不一样类型的键值对,RDB文件会使用不一样的方式来保存他们。
AOF持久化:经过保存Redis服务器所执行的写命令来记录数据库状态
appendsysnc 三种选项设置 always、everysec、no
为解决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函数一个时间事件,而且这个事件是周期性事件;
文件事件和时间事件之间是合做关系,服务器会轮流处理这两种时间,而且处理事件的过程也不会进行抢占;
时间事件的实际处理事件一般会比设定的到达时间晚一些;