91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
selectcmd = createObject(REDIS_STRING,
sdscatprintf(sdsempty(),
"*2\r\n$6\r\nSELECT\r\n$%d\r\n%s\r\n",
dictid_len, llstr));
}
// 这里可能会有疑问:为什么把数据添加入积压空间,又把数据分发给所有
// 为什么不仅仅将数据分发给所有从机呢?
// 因为有一些从机会因特殊情况(???)与主机断开连接,注意从机断开
// 主机的状态信息,因此这些断开的从机就没有及时收到更新的数据。red
// 断开的从机在下次连接后能够获取更新数据,将更新数据加入了积压空
// 将 SELECT 命令对应的 redis 对象数据添加到积压空间
/* Add the SELECT command into the backlog. */
if
(server.repl_backlog) feedReplicationBacklogWithObject(selectcm
// 将数据分发所有的从机
/* Send it to slaves. */
listRewind(slaves, &li);
while
((ln = listNext(&li))) {
redisClient *slave = ln->value;
addReply(slave, selectcmd);
}
// 销毁对象
if
(dictid < 0 || dictid >= REDIS_SHARED_SELECT_CMDS)
decrRefCount(selectcmd);
}
// 更新最近一次使用(访问)的数据集
server.slaveseldb = dictid;
// 将命令写入积压空间
/* Write the command to the replication backlog if any. */
if
(server.repl_backlog) {
char
aux[REDIS_LONGSTR_SIZE+3];
// 命令个数
/* Add the multi bulk reply length. */
aux[0] ='*';
len = ll2string(aux + 1,
sizeof
(aux) - 1, argc);
aux[len+1] ='\r';
aux[len+2] ='\n';
feedReplicationBacklog(aux, len + 3);