package main import ( "bufio" "fmt" "net" "os" "strings" ) var database map[string]string func main() { database = make(map[string]string) 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 handleGet(conn net.Conn, key string) { value, exists := database[key] if exists { // Redis protocol format for a string reply conn.Write([]byte("+" + value + "\r\n")) } else { // Redis protocol format for a Nil/Null response conn.Write([]byte("$-1\r\n")) } } func handleSet(conn net.Conn, key, value string) { database[key] = value conn.Write([]byte("+OK\r\n")) } func handleConnection(conn net.Conn) { defer conn.Close() fmt.Println("Client connected:", conn.RemoteAddr()) reader := bufio.NewReader(conn) for { message, err := reader.ReadString('\n') if err != nil { fmt.Println("Client disconnected:", conn.RemoteAddr()) return } message = strings.TrimSpace(message) fmt.Printf("Received: %s\n", message) args := strings.Fields(message) if len(args) == 0 { continue } command := strings.ToUpper(args[0]) switch { case command == "GET" && len(args) == 2: handleGet(conn, args[1]) case command == "SET" && len(args) == 3: handleSet(conn, args[1], args[2]) default: conn.Write([]byte("-ERR unknown command or wrong arguments\r\n")) } } }