Redis клиент для Go (Golang) — go-redis и radix

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

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

Начать курс

Redis клиент для Go (Golang): go-redis и radix

Redis — одна из самых популярных in-memory баз данных, используемая для кэширования, очередей, сессий и real-time аналитики. В экосистеме Go (Golang) существует несколько зрелых клиентов для работы с Redis. В этой статье мы подробно разберём две основные библиотеки: go-redis (самый популярный клиент) и radix (более производительный и низкоуровневый). Вы узнаете, как их устанавливать, подключаться, выполнять базовые операции, использовать конвейеры, Pub/Sub и работать с кластером.

1. Почему Redis важен для Go-разработчика

Go часто выбирают для создания высоконагруженных серверных приложений, микросервисов и обработчиков событий. Redis отлично дополняет Go благодаря:

  • Скорости — операции выполняются за микросекунды.
  • Простоте — минималистичный API, встроенные структуры данных (строки, списки, множества, хеши).
  • Поддержке Pub/Sub, транзакций и Lua-скриптов.

Правильный выбор клиента определяет производительность и удобство разработки.

2. go-redis — стандарт де-факто

go-redis (репозиторий github.com/redis/go-redis/v9) — самый популярный Redis-клиент для Go. Он предоставляет высокоуровневый API, поддержку кластеров, сентинелей, конвейеров, Pub/Sub и распределённых блокировок.

2.1 Установка

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

2.2 Подключение к 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
}

2.3 Базовые операции

// Установка строки
err := rdb.Set(ctx, "key", "value", 0).Err()
if err != nil {
    panic(err)
}

// Получение строки
val, err := rdb.Get(ctx, "key").Result()
if err != nil {
    panic(err)
}
fmt.Println("key:", val)

// Работа с хешами
rdb.HSet(ctx, "user:1", "name", "Alice", "age", 30)
name, _ := rdb.HGet(ctx, "user:1", "name").Result()
fmt.Println("Имя:", name)

// Удаление ключа
rdb.Del(ctx, "key")

2.4 Конвейеры (Pipelines)

Конвейеры позволяют отправлять несколько команд за один сетевой вызов, что значительно ускоряет пакетные операции.

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.5 Pub/Sub

// Подписчик
sub := rdb.Subscribe(ctx, "mychannel")
ch := sub.Channel()

for msg := range ch {
    fmt.Printf("Получено: %s\n", msg.Payload)
}

// Издатель (в другой горутине)
rdb.Publish(ctx, "mychannel", "Hello from Go!")

2.6 Работа с кластером

clusterClient := redis.NewClusterClient(&redis.ClusterOptions{
    Addrs: []string{
        "localhost:7000",
        "localhost:7001",
        "localhost:7002",
    },
})

// Используется как обычный клиент
err := clusterClient.Set(ctx, "cluster_key", "value", 0).Err()
if err != nil {
    panic(err)
}

3. radix — лёгкий и быстрый

radix (github.com/mediocregopher/radix/v4) — минималистичный клиент с низким уровнем абстракции. Он не имеет зависимостей, работает быстрее go-redis на простых операциях и даёт полный контроль над сетевым уровнем.

3.1 Установка

go get github.com/mediocregopher/radix/v4

3.2 Подключение и базовые команды

package main

import (
    "context"
    "fmt"
    "github.com/mediocregopher/radix/v4"
)

func main() {
    ctx                    

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