Redis 命令执行过程(上) (5)

命令传播就是将命令写入 repl-backlog-buffer 缓冲中,并发送给各个从服务器中。

// 执行client中持有的 redisCommand 命令 void call(client *c, int flags) { /** * dirty记录数据库修改次数;start记录命令开始执行时间us;duration记录命令执行花费时间 */ long long dirty, start, duration; int client_old_flags = c->flags; /** * 有监视器的话,需要将不是从AOF获取的命令会发送给监视器。当然,这里会消耗时间 */ if (listLength(server.monitors) && !server.loading && !(c->cmd->flags & (CMD_SKIP_MONITOR|CMD_ADMIN))) { replicationFeedMonitors(c,server.monitors,c->db->id,c->argv,c->argc); } .... /* Call the command. */ dirty = server.dirty; start = ustime(); // 处理命令,调用命令处理函数 c->cmd->proc(c); duration = ustime()-start; dirty = server.dirty-dirty; if (dirty < 0) dirty = 0; .... // Lua 脚本的一些特殊处理 /** * CMD_CALL_SLOWLOG 表示要记录慢查询日志 */ if (flags & CMD_CALL_SLOWLOG && c->cmd->proc != execCommand) { char *latency_event = (c->cmd->flags & CMD_FAST) ? "fast-command" : "command"; latencyAddSampleIfNeeded(latency_event,duration/1000); slowlogPushEntryIfNeeded(c,c->argv,c->argc,duration); } /** * CMD_CALL_STATS 表示要统计 */ if (flags & CMD_CALL_STATS) { c->lastcmd->microseconds += duration; c->lastcmd->calls++; } /** * CMD_CALL_PROPAGATE表示要进行广播命令 */ if (flags & CMD_CALL_PROPAGATE && (c->flags & CLIENT_PREVENT_PROP) != CLIENT_PREVENT_PROP) { int propagate_flags = PROPAGATE_NONE; /** * dirty大于0时,需要广播命令给slave和aof */ if (dirty) propagate_flags |= (PROPAGATE_AOF|PROPAGATE_REPL); .... /** * 广播命令,写如aof,发送命令到slave * 也就是传说中的传播命令 */ if (propagate_flags != PROPAGATE_NONE && !(c->cmd->flags & CMD_MODULE)) propagate(c->cmd,c->db->id,c->argv,c->argc,propagate_flags); } .... }

由于文章篇幅问题,本篇文章就先讲到这里,后半部分在接下来的文章中进行讲解,欢迎大家继续关注。

个人博客,欢迎来玩

Redis 命令执行过程(上)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywdwf.html