Redis — мощное хранилище данных в памяти, широко используется для кэширования данных. В сочетании с Go, статически типизированным, компилируемым языком программирования, разработанным для простоты и эффективности, Redis может значительно улучшить производительность и масштабируемость ваших приложений. Эта статья поможет интегрировать Redis в ваши проекты на Go.
Установка и настройка клиента
Прежде всего установите Redis в ваш проект.
go get github.com/redis/go-redis/v9
Для взаимодействия с Redis необходимо сконфигурировать клиент.
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
)
func main() {
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "1234",
DB: 0,
})
}
Если же для подключения в вашем проекте используется строка подключения (connection string), то используйте следующий пример.
opt, err := redis.ParseURL("redis://<user>:<pass>@localhost:6379/<db>")
// обработайте ошибку err
client := redis.NewClient(opt)
Примеры использования
Redis отлично подходит для хранения простых пар ключ-значение. Вот как сохранить и получить простую строку:
ctx := context.Background()
err := client.Set(ctx, "key", "value", 0).Err()
// обработайте ошибку err
val, err := client.Get(ctx, "key").Result()
// обработайте ошибку err
fmt.Println("key", val)
Работа с map
Redis поддерживает различные типы данных. Ниже приведен пример хранения и извлечения объекта пользователя.
user := map[string]interface{}{
"name": "John Doe",
"age": 30,
"country": "USA",
}
err := client.HSet(ctx, "user:100", user).Err()
// обработайте ошибку err
user, err = client.HGetAll(ctx, "user:100").Result()
// обработайте ошибку err
fmt.Println(user)
Работа со структурами
Для хранения структур нам необходимо научить наши структуры сериализовываться в бинарный формат. Для этого возьмем для примера простую структуру User и реализуем интерфейс BinaryMarshaler и BinaryUnmarshaler.
type User struct {
ID int `json:"id"`
Name string `json:"name"`
}
func (u User) MarshalBinary() ([]byte, error) {
return json.Marshal(u)
}
func (u User) UnmarshalBinary(data []byte) error {
return json.Unmarshal(data, &u)
}
Это позволит Redis преобразовать структуру User в байты и сохранить полученные байты в памяти. Теперь попробуем сохранить стуктуру в Redis:
user := User{ID: 1, Name: "John Doe"}
err := rdb.Set(ctx, "user:1", user, 0).Err()
// обработайте ошибку err
err = rdb.Get(ctx, "user:1").Scan(&user)
// обработайте ошибку err
fmt.Println(user)
В результате мы смогли сохранить и получить структуру из Redis.