Cliente Redis para Go (Golang): go-redis e redigo
\n\nRedis é 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\nMostraremos 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\n1. go-redis — cliente moderno e funcional
\n\ngo-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\nInstalação do go-redis
\nPara instalar, execute o comando no terminal:
\ngo get github.com/redis/go-redis/v9\n\nConexão e operações básicas
\nExemplo de uma aplicação simples que se conecta ao Redis, grava e lê dados:
\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 // 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\nTrabalhando com hashes, listas e conjuntos
\ngo-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\nPool de conexões e configuração
\ngo-redis gerencia automaticamente o pool de conexões. Você pode configurar seu tamanho:
\nrdb := 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\nPub/Sub (publicador-assinante)
\nExemplo 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\nPipeline (condutor)
\nPermite enviar vários comandos em uma única requisição, acelerando significativamente o trabalho:
\npipe := 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