持久化
AOF日志载入优先于RDF文件载入。
RDB
Rdb持久化策略,配置文件中设置:
间歇自动保存策略,redis中存储lastSave和dirty计算器来保存上次保存成功的时间和上次保存到现在的数据修改次数。
在服务器载入RDB文件时,服务器阻塞状态直到载入完成。
命令:
SAVE BGSAVE,save会阻塞请求执行持久化,bgsave会fork子进程,不会阻塞命令,内存采用copy on write方式,只有在有写操作时才会在子进程中复制这块内存。
SAVE BGSAVE BGREWRITEAOF(aof重写)不可同时执行,SAVE BGSAVE同时发送命令会拒绝,SAVE过程中发送BGREWRITEAOF回推迟到save完成之后再处理。
save、bgsvae操作会耗费大量CPU、内存和IO。
AOF
- AOF文件只存写命令。
- AOF载入时,使用伪客户端形式,执行AOF文件中的命令。
- aof buffer缓冲区,在文件事件执行完命令之后,写命令会追加到缓存区,缓存区与硬盘同步规则可配置:每次都同步、每秒同步一次、依赖操作系统同步。
AOF重写:
aof文件很大,根据数据库状态来重写,可以很大程度压缩aof文件大小,比如一个数据只用一个条命令,原文件可能会是多条;重写时过期元素不管,只有过期元素被删除了才会追加一条del命令;元素比较多的集合会分为多条命令,默认64个元素一条命令,防止缓冲区溢出。
AOF重写缓冲区
异步重写时,在fork子进程后,所有的写命令都写入重写缓冲区,在子进程处理完之后,将重写缓冲区中的命令执行,然后aof状态就会与当前数据库一直,然后将aof文件原子替换原来aof文件。
主从同步策略
可以根据配置在启动时或者使用命令在启动后成为别的服务器的从服务器: slaveof 127.0.0.1 6379
命令传播阶段从节点每秒发送心跳到主服务器,发送复制偏移量,目的是检测网络状态、检测从服务器偏移量是否一直(网络原因造成命令丢失会造成偏移量不一致)、辅助实现min-slaves选项(min-slaves可以配置从节点数量小于N个或N个从节点的延迟大于M秒则主服务器拒绝写操作)。
2.8版本以及之后的版本增加了增量同步数据方式。从服务器断线重连后先尝试增量同步,如果失败(同步偏移量超出同步缓冲区)再使用全量同步。
全量同步
- 从服务器向主服务器发送sync命令同步数据(刚刚成为从服务器时);
- 主服务器在收到sync命令后执行bgsave命令在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令;
- 主服务器bgsave执行完毕时,将RBD文件发送给从服务器(渠道?),从服务器接收RDB文件后载入,将状态更新至主服务器执行bgsave时的状态;
- 主服务器将记录在缓冲区的所有写命令发送给从服务器,从服务器执行完后状态与主服务器一致;
- 后续主服务器的写命令全部使用命令传播方式发送给从服务器来保持主从数据一致。
增量同步
概念:
- 主从分布维护一个复制偏移量,主服务器每次向从服务器传播N个字节的数据时,将自己的复制偏移量加N,从服务器收到命令执行完后也将自己的偏移量加N;
- 复制积压缓冲区,固定长度的先进先出队列,默认1M。如果队列满,最后的命令入队,第一个命令出队,被挤压出队列,所以缓冲区存储的是最新的一部分命令。主服务器向从服务器传播命令同时将命令写入复制积压缓冲区,并且为队列中每个字节记录复制偏移量。从服务器的偏移量超出缓冲区的记录就需要全量同步。
- 服务器运行ID:从服务器中会存储主服务器的Id,如果断线重连后主服务器判断id与从服务器传来的存储的id相同则表明主服务未变化,则可以psync进行增量同步;如果id不同,则执行全量同步。
步骤:
- 从服务器断线重连后发送psync命令
psync runid offset
,参数中带着从服务器的复制偏移量(psync -1表示要全量同步数据); - 主服务器根据runid和offset判断使用哪种同步方式;返回+FULLRESYNC runid offset表示完整同步、返回+CONTINUE回复表示进行增量同步。
事件
文件事件
IO多路复用程序监听套接字的连接、读、写、关闭事件,将套接字放入队列中,从队列中按顺序、同步发送给文件事件分派器,分派器再根据事件的不同类型,发送给不同的事件处理器。
多路IO复用程序实现,Redis包装了多个系统的IO多路复用函数库,包括select、epoll、evport、kqueue,使用相同的API,所以多个实现之间可以互换,Redis在编译时会取当前系统中性能最高IO多路复用函数库。
时间事件
实现
服务器所有的时间事件都放在一个无序的链表中,每当时间事件执行器运行时,它就遍历整个链表,查找所有已到达的时间事件并调用相应的事件处理器。
ServiceCron事件
100ms执行一次
职责
- 清除过期键值对;
- 更新服务器的统计信息,如内存占用、数据库占用等;
- 关闭清理失效的客户端;
- 如果是主服务器,同步从服务器数据;
- 集群模式,对集群进行定期同步和连接测试;
- 尝试进行RDB或AOF持久化操作:执行被延迟的AOFREWRITE操作、将AOF缓冲区内容写入AOF文件;
- 更新lru时钟,每个对象的lru属性更新,默认每十秒更新一次;
- 更新服务器时间缓存,提供给需要服务器时间的调用函数。