Cliente Redis para Go (Golang): go-redis e redigo — guia completo

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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

\n\n

Redis é um armazenamento de dados in-memory de alto desempenho, frequentemente usado como banco de dados, cache e broker de mensagens. Para trabalhar com Redis na linguagem Go (Golang), existem vários clientes populares. Neste artigo, abordaremos detalhadamente duas bibliotecas principais: go-redis (a opção mais popular e moderna) e redigo (mais de baixo nível, mas testada pelo tempo).

\n\n

Mostraremos como instalar cada uma delas, conectar-se ao servidor, executar operações básicas, trabalhar com pool de conexões, usar pub/sub e processamento em pipeline. O material será útil tanto para iniciantes quanto para desenvolvedores experientes que desejam integrar Redis em suas aplicações Go.

\n\n

1. go-redis — cliente moderno e funcional

\n\n

go-redis é uma biblioteca cliente para Redis escrita em Go. Ela suporta todos os principais recursos do Redis 6 e 7, incluindo clusterização, Sentinel, pub/sub, transações, pipeline e scripts Lua. A biblioteca é ativamente desenvolvida e possui uma API conveniente.

\n\n

Instalação do go-redis

\n

Para instalar, execute o comando no terminal:

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

Conexão e operações básicas

\n

Exemplo de uma aplicação simples que se conecta ao Redis, grava e lê dados:

\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    // Cria o cliente\n    rdb := redis.NewClient(&redis.Options{\n        Addr:     "localhost:6379",\n        Password: "", // sem senha\n        DB:       0,  // banco de dados padrão\n    })\n\n    // Verifica a conexão\n    pong, err := rdb.Ping(ctx).Result()\n    if err != nil {\n        panic(err)\n    }\n    fmt.Println(pong) // PONG\n\n    // Grava um valor\n    err = rdb.Set(ctx, "key", "hello from Go", 0).Err()\n    if err != nil {\n        panic(err)\n    }\n\n    // Lê o 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

Trabalhando com hashes, listas e conjuntos

\n

go-redis suporta todos os tipos de dados do Redis. Exemplo de trabalho com hash:

\n
// Grava um 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// Lê um campo\nname, err := rdb.HGet(ctx, "user:1000", "name").Result()\nfmt.Println("Name:", name)\n\n// Lê o hash completo\nuser, err := rdb.HGetAll(ctx, "user:1000").Result()\nfmt.Println("User:", user)
\n\n

Pool de conexões e configuração

\n

go-redis gerencia automaticamente o pool de conexões. Você pode configurar seu tamanho:

\n
rdb := redis.NewClient(&redis.Options{\n    Addr:         "localhost:6379",\n    PoolSize:     10, // número máximo de conexões no pool\n    MinIdleConns: 3,  // número mínimo de conexões ociosas\n})
\n\n

Pub/Sub (publicador-assinante)

\n

Exemplo de inscrição em um canal e publicação de mensagem:

\n
// Inscrição\nsub := rdb.Subscribe(ctx, "mychannel")\nch := sub.Channel()\n\n// Em uma goroutine separada, escuta as mensagens\ngo func() {\n    for msg := range ch {\n        fmt.Printf("Received: %s from %s\\n", msg.Payload, msg.Channel)\n    }\n}()\n\n// Publicação\nerr := rdb.Publish(ctx, "mychannel", "Hello subscribers!").Err()
\n\n

Pipeline (condutor)

\n

Permite enviar vários comandos em uma única requisição, acelerando significativamente o trabalho:

\n
pipe := rdb.Pipeline()\n\nincr := pipe.Incr(ctx, "counter")\npipe.Expire(ctx, "counter", time.Hour)\n\n// Executa todos os comandos\n_, err := pipe.Exec(ctx)\nif err != nil {\n    panic(err)\n}\nfmt.Println("Counter:", incr.Val())
\n\n

2. Redig

Recommendations