Використання структур з Redis та Golang

pic

Використання структур з 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)

Leave a Reply

Your email address will not be published. Required fields are marked *