Cliente Redis para Go (Golang): go-redis y redigo
\n\nRedis es un almacén de datos en memoria de alto rendimiento que se utiliza a menudo como base de datos, caché y bróker de mensajes. Para trabajar con Redis en el lenguaje Go (Golang) existen varios clientes populares. En este artículo, analizaremos en detalle dos bibliotecas principales: go-redis (la opción más popular y moderna) y redigo (de más bajo nivel, pero probada a lo largo del tiempo).
\n\nMostraremos cómo instalar cada una, conectarse al servidor, realizar operaciones básicas, trabajar con un pool de conexiones, usar pub/sub y procesamiento en pipeline. El material será útil tanto para principiantes como para desarrolladores experimentados que deseen integrar Redis en sus aplicaciones Go.
\n\n1. go-redis — un cliente moderno y funcional
\n\ngo-redis es una biblioteca cliente para Redis escrita en Go. Soporta todas las funcionalidades principales de Redis 6 y 7, incluyendo clustering, Sentinel, pub/sub, transacciones, pipeline y scripts Lua. La biblioteca se desarrolla activamente y tiene una API conveniente.
\n\nInstalación de go-redis
\nPara instalarla, ejecute el comando en la terminal:
\ngo get github.com/redis/go-redis/v9\n\nConexión y operaciones básicas
\nEjemplo de una aplicación simple que se conecta a Redis, escribe y lee datos:
\npackage main\n\nimport (\n "context"\n "fmt"\n "github.com/redis/go-redis/v9"\n)\n\nfunc main() {\n ctx := context.Background()\n\n // Creamos el cliente\n rdb := redis.NewClient(&redis.Options{\n Addr: "localhost:6379",\n Password: "", // sin contraseña\n DB: 0, // base de datos por defecto\n })\n\n // Verificamos la conexión\n pong, err := rdb.Ping(ctx).Result()\n if err != nil {\n panic(err)\n }\n fmt.Println(pong) // PONG\n\n // Escribimos un valor\n err = rdb.Set(ctx, "key", "hello from Go", 0).Err()\n if err != nil {\n panic(err)\n }\n\n // Leemos el valor\n val, err := rdb.Get(ctx, "key").Result()\n if err != nil {\n panic(err)\n }\n fmt.Println("key:", val)\n}\n\nTrabajo con hashes, listas y conjuntos
\ngo-redis soporta todos los tipos de datos de Redis. Ejemplo de trabajo con un hash:
\n// Escritura de un hash\nerr := rdb.HSet(ctx, "user:1000", map[string]interface{}{\n "name": "Alice",\n "age": 30,\n "city": "Moscow",\n}).Err()\nif err != nil {\n panic(err)\n}\n\n// Lectura de un campo\nname, err := rdb.HGet(ctx, "user:1000", "name").Result()\nfmt.Println("Name:", name)\n\n// Lectura de todo el hash\nuser, err := rdb.HGetAll(ctx, "user:1000").Result()\nfmt.Println("User:", user)\n\nPool de conexiones y configuración
\ngo-redis gestiona automáticamente el pool de conexiones. Puede configurar su tamaño:
\nrdb := redis.NewClient(&redis.Options{\n Addr: "localhost:6379",\n PoolSize: 10, // número máximo de conexiones en el pool\n MinIdleConns: 3, // número mínimo de conexiones inactivas\n})\n\nPub/Sub (publicador-suscriptor)
\nEjemplo de suscripción a un canal y publicación de un mensaje:
\n// Suscripción\nsub := rdb.Subscribe(ctx, "mychannel")\nch := sub.Channel()\n\n// En una gorutina separada escuchamos los mensajes\ngo func() {\n for msg := range ch {\n fmt.Printf("Received: %s from %s\\n", msg.Payload, msg.Channel)\n }\n}()\n\n// Publicación\nerr := rdb.Publish(ctx, "mychannel", "Hello subscribers!").Err()\n\nPipeline (tubería)
\nPermite enviar varios comandos en una sola solicitud, lo que acelera significativamente el trabajo:
\npipe := rdb.Pipeline()\n\nincr := pipe.Incr(ctx, "counter")\npipe.Expire(ctx, "counter", time.Hour)\n\n// Ejecutamos todos los comandos\n_, err := pipe.Exec(ctx)\nif err != nil {\n panic(err)\n}\nfmt.Println("Counter:", incr.Val())\n\n2. Redig
También en la biblioteca
Cliente Elasticsearch para C++: elasticlient y guía completa
Generación de PDF en TypeScript: bibliotecas y herramientas para Node.js
Programación reactiva en C++: bibliotecas y práctica
Generación de informes PDF en Go (Golang): bibliotecas y ejemplos