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 Также в библиотеке
Работа с XML в C# (.NET): полное руководство по парсингу и созданию
Rate limiting в C++: библиотеки и инструменты для контроля запросов
PDF генерация в Swift (iOS/macOS): обзор инструментов и примеры
Планировщик задач Java: Quartz Scheduler — полное руководство