package main import ( "bufio" "fmt" "net" "os" "strings" ) var db RedisDB func main() { db = RedisDB{data: make(map[string]any)} listener, err := net.Listen("tcp", ":6379") if err != nil { fmt.Println("error starting server: ", err) os.Exit(1) } defer listener.Close() fmt.Println("Redis clone listening on port 6379...") for { conn, err := listener.Accept() if err != nil { fmt.Println("Error accepting connection:", err) continue } go handleConnection(conn) } } func handleConnection(conn net.Conn) { defer conn.Close() fmt.Println("Client connected:", conn.RemoteAddr()) reader := bufio.NewReader(conn) for { args, err := parseRESP(reader) if err != nil { fmt.Println("Client disconnected or error parsing:", conn.RemoteAddr(), err) return } if len(args) == 0 { continue } fmt.Printf("Parsed RESP Arguments: %v\n", args) command := strings.ToUpper(args[0]) switch { case command == "GET" && len(args) == 2: handleGet(conn, args) case command == "SET" && len(args) == 3: handleSet(conn, args) case command == "EXISTS" && len(args) == 2: handleExists(conn, args) case command == "DEL" && len(args) == 2: handleDel(conn, args) case command == "INCR" && len(args) == 2: handleIncr(conn, args) case command == "DECR" && len(args) == 2: handleDecr(conn, args) case command == "PING" && len(args) == 1: handlePing(conn, args) case command == "FLUSHALL" && len(args) == 1: handleFlushall(conn, args) case command == "RPUSH" && len(args) >= 3: handleRpush(conn, args) case command == "LRANGE" && len(args) == 4: handleLrange(conn, args) default: conn.Write([]byte("-ERR unknown command or wrong arguments\r\n")) } } }