Використання структур з Redis
Часто нам потрібно зберігати структуру в Redis замість зберігання лише окремих полів. Ми можемо зберігати структуру ось так:
Повний фрагмент коду:
package main
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
)
type Media struct {
Title string `redis:"title"`
IsPopular bool `redis:"is_popular"`
AgeRating int `redis:"age_rating"`
IgnoredField int `redis:"-"`
}
func main() {
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
Protocol: 2,
})
ctx := context.Background()
key := "media01"
if _, err := client.Pipelined(ctx, func(rdb redis.Pipeliner) error {
rdb.HSet(ctx, key, "title", "Inception")
rdb.HSet(ctx, key, "is_popular", 1)
rdb.HSet(ctx, key, "age_rating", 13)
return nil
}); err != nil {
panic(err)
}
var media Media
if err := client.HGetAll(ctx, key).Scan(&media); err != nil {
panic(err)
}
fmt.Printf("Title: %s - IsPopular: %t - AgeRating: %d\n", media.Title, media.IsPopular, media.AgeRating)
}
Ми можемо використовувати мітки полів структури для зміни імені поля всередині хешу.
type Media struct {
Title string `redis:"title"`
IsPopular bool `redis:"is_popular"`
AgeRating int `redis:"age_rating"`
IgnoredField int `redis:"-"`
}
Ми також можемо ігнорувати поле за допомогою мітки поля структури -. Таким чином, поле існуватиме в структурі, але не буде збережене в Redis.
Бібліотека go-redis не надає способу безпосередньо зберігати структуру, тому ми використовуємо конвеєр для завантаження деяких значень у нашу базу даних.
if _, err := client.Pipelined(ctx, func(rdb redis.Pipeliner) error {
rdb.HSet(ctx, key, "title", "Inception")
rdb.HSet(ctx, key, "is_popular", 1)
rdb.HSet(ctx, key, "age_rating", 13)
return nil
}); err != nil {
panic(err)
}
Після того, як значення надіслані в базу даних, ми можемо виконати сканування, щоб заповнити значення в нашу структуру.
var media Media
if err := client.HGetAll(ctx, key).Scan(&media); err != nil {
panic(err)
}
І після того, як значення заповнено в нашу структуру, ми можемо вивести ці значення:
Title: Inception - IsPopular: true - AgeRating: 13
Перекладено з: [Using structs with Redis and Golang](https://medium.com/@go_26185/using-structs-with-redis-and-golang-2064ecccaebe)