Cliente Redis para Go (Golang): go-redis y redigo — guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Cliente Redis para Go (Golang): go-redis y redigo

\n\n

Redis 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\n

Mostraremos 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\n

1. go-redis — un cliente moderno y funcional

\n\n

go-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\n

Instalación de go-redis

\n

Para instalarla, ejecute el comando en la terminal:

\n
go get github.com/redis/go-redis/v9
\n\n

Conexión y operaciones básicas

\n

Ejemplo de una aplicación simple que se conecta a Redis, escribe y lee datos:

\n
package 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\n

Trabajo con hashes, listas y conjuntos

\n

go-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\n

Pool de conexiones y configuración

\n

go-redis gestiona automáticamente el pool de conexiones. Puede configurar su tamaño:

\n
rdb := 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\n

Pub/Sub (publicador-suscriptor)

\n

Ejemplo 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\n

Pipeline (tubería)

\n

Permite enviar varios comandos en una sola solicitud, lo que acelera significativamente el trabajo:

\n
pipe := 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\n

2. Redig

Recommendations