godis
godis copied to clipboard
LoadAof疑问
ret := persister.db.Exec(fakeConn, r.Args)
if protocol.IsErrorReply(ret) {
logger.Error("exec err", string(ret.ToBytes()))
}
if strings.ToLower(string(r.Args[0])) == "select" {
// execSelect success, here must be no error
dbIndex, err := strconv.Atoi(string(r.Args[1]))
if err == nil {
persister.currentDB = dbIndex
}
}
select命令已经注册了, 这一行就能正确处理了呀ret := persister.db.Exec(fakeConn, r.Args), 为什么底下还要重新处理一遍? 注释我也没太看懂. 希望老师解答.
persister.currentDB 记录了 aof 文件当前正在写哪个 db,以避免在后续写入 aof 的过程中写错数据库。 select 命令只改变了当前写入的数据库而不改变 persister.currentDB
LoadAof 过程中会持续的遇到 select 命令,这里要做的就是记录下最后 select 的 db,这样后续的 writeAof 就不会出错写到其他 db 里去