t;error")
}
deleted += intReply.Code
}
if errReply == nil {
return reply.MakeIntReply(deleted)
}
return reply.MakeErrReply("error occurs: " + errReply.Error())
}
cluster/select.go
// select指令实现
func execSelect(cluster *clusterDatabase, c resp.Connection, cmdAndArgs [][]byte) resp.Reply {
return cluster.db.Exec(c, cmdAndArgs)
}
cluster/cluster_database.go
var router = makeRouter()
// clusterDatabase执行命令逻辑
func (cluster *clusterDatabase) Exec(c resp.Connection, cmdLine [][]byte) (result resp.Reply) {
defer func() {
if err := recover(); err != nil {
logger.Warn(fmt.Sprintf("error occurs: %v\n%s", err, string(debug.Stack())))
result = &reply.UnknownErrReply{}
}
}()
cmdName := strings.ToLower(string(cmdLine[0]))
cmdFunc, ok := router[cmdName]
if !ok {
return reply.MakeErrReply("ERR unknown command '" + cmdName + "', or not supported in cluster mode")
}
result = cmdFunc(cluster, c, cmdLine)
return
}
resp/handler/handler.go
func MakeHandler() *RespHandler {
var db databaseface.Database
// 判断是单机还是集群
if config.Properties.Self != "" && len(config.Properties.Peers) > 0 {
db = cluster.MakeClusterDatabase()
} else {
db = database.NewStandaloneDatabase()
}
return &RespHandler{
db: db,
}
}
MakeHandler:判断是单机还是集群
测试
先go build,打开项目文件夹找到exe文件,把exe文件和redis.conf放到一个文件夹里,redis.conf改成如下,然后启动exe文件。再回到GoLand启动第二个节点6379。
bind 0.0.0.0
port 6380
appendonly yes
appendfilename appendonly.aof
self 127.0.0.1:6380
peers 127.0.0.1:6379