命令传播:
命令传播有两个对象:
-
AOF文件:
AOF文件接收服务器发来的命令;
-
主从复制模式下的从服务器:
从服务器与主服务器同步后,进行命令传播,从服务器接收主服务器发来的命令并执行[1];
propagate函数会在call函数[1]中被调用,所以服务器执行命令,数据库状态产生变化时,通过命令传播,来尽可能实现数据一致性;
void propagate(struct redisCommand *cmd, int dbid, robj **argv, int argc,
int flags)
{
if (server.aof_state != REDIS_AOF_OFF && flags & REDIS_PROPAGATE_AOF)
/* 命令传播给AOF文件 */
feedAppendOnlyFile(cmd,dbid,argv,argc);
if (flags & REDIS_PROPAGATE_REPL)
/* 命令传播给从服务器 */
replicationFeedSlaves(server.slaves,dbid,argv,argc);
}
- L6:将命令写入AOF缓冲区,当AOF重写正在进行时,也会写入AOF重写缓冲区;发送给客户端的时机在事件循环[2]的beforesleep函数中;
- L9:将命令写给从服务器(addReply*[1]),可能也会写入复制积压缓冲区[3](backlog),发送时机见[1];