Redis клиент для Go (Golang): go-redis и redigo
Redis — это высокопроизводительное in-memory хранилище данных, которое часто используется как база данных, кэш и брокер сообщений. Для работы с Redis на языке Go (Golang) существует несколько популярных клиентов. В этой статье мы подробно рассмотрим две основные библиотеки: go-redis (самый популярный и современный вариант) и redigo (более низкоуровневый, но проверенный временем).
Мы покажем, как установить каждую из них, подключиться к серверу, выполнять базовые операции, работать с пулом соединений, использовать pub/sub и конвейерную обработку (pipeline). Материал будет полезен как новичкам, так и опытным разработчикам, которые хотят интегрировать Redis в свои Go-приложения.
1. go-redis — современный и функциональный клиент
go-redis — это клиентская библиотека для Redis, написанная на Go. Она поддерживает все основные возможности Redis 6 и 7, включая кластеризацию, Sentinel, pub/sub, транзакции, pipeline и Lua-скрипты. Библиотека активно развивается и имеет удобный API.
Установка go-redis
Для установки выполните команду в терминале:
go get github.com/redis/go-redis/v9
Подключение и базовые операции
Пример простого приложения, которое подключается к Redis, записывает и читает данные:
package main
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
)
func main() {
ctx := context.Background()
// Создаем клиента
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // без пароля
DB: 0, // база данных по умолчанию
})
// Проверяем соединение
pong, err := rdb.Ping(ctx).Result()
if err != nil {
panic(err)
}
fmt.Println(pong) // PONG
// Записываем значение
err = rdb.Set(ctx, "key", "hello from Go", 0).Err()
if err != nil {
panic(err)
}
// Читаем значение
val, err := rdb.Get(ctx, "key").Result()
if err != nil {
panic(err)
}
fmt.Println("key:", val)
}
Работа с хешами, списками и множествами
go-redis поддерживает все типы данных Redis. Пример работы с хешем:
// Запись хеша
err := rdb.HSet(ctx, "user:1000", map[string]interface{}{
"name": "Alice",
"age": 30,
"city": "Moscow",
}).Err()
if err != nil {
panic(err)
}
// Чтение одного поля
name, err := rdb.HGet(ctx, "user:1000", "name").Result()
fmt.Println("Name:", name)
// Чтение всего хеша
user, err := rdb.HGetAll(ctx, "user:1000").Result()
fmt.Println("User:", user)
Пул соединений и конфигурация
go-redis автоматически управляет пулом соединений. Вы можете настроить его размер:
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
PoolSize: 10, // максимальное количество соединений в пуле
MinIdleConns: 3, // минимальное количество idle-соединений
})
Pub/Sub (издатель-подписчик)
Пример подписки на канал и публикации сообщения:
// Подписка
sub := rdb.Subscribe(ctx, "mychannel")
ch := sub.Channel()
// В отдельной горутине слушаем сообщения
go func() {
for msg := range ch {
fmt.Printf("Received: %s from %s\n", msg.Payload, msg.Channel)
}
}()
// Публикация
err := rdb.Publish(ctx, "mychannel", "Hello subscribers!").Err()
Pipeline (конвейер)
Позволяет отправить несколько команд за один запрос, что значительно ускоряет работу:
pipe := rdb.Pipeline()
incr := pipe.Incr(ctx, "counter")
pipe.Expire(ctx, "counter", time.Hour)
// Выполняем все команды
_, err := pipe.Exec(ctx)
if err != nil {
panic(err)
}
fmt.Println("Counter:", incr.Val())
2. Redigo — легковесный и быстрый клиент
Redigo — это минималистичная библиотека для работы с Redis. Она предоставляет низкоуровневый доступ к протоколу Redis и требует больше ручного управления, но при этом очень быстрая и гибкая. Redigo идеально подходит для проектов, где важна производительность и контроль над соединениями.
Установка redigo
go get github.com/gomodule/redigo/redis