Redis клиент для Go (Golang): go-redis и redigo — полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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

Рекомендаций