Получение структуры по ключу из Redis Golang
Имею подобную структуру
type myStruct struct {
TotalCount int `json:"inventory_total_count"`
TotalPrice int `json:"inventory_total_price"`
GameList []string `json:"game_list"`
UserInfo UserInformation `json:"user_info"`
GameInventory map[string]InventoryGame `json:"inventory"`
}
type InventoryGame struct {
GameAssetsTotalCount int `json:"game_assets_total_count"`
GameAssetsTotalPrice int `json:"game_assets_total_price"`
GameID string `json:"gameid"`
Assets []InventoryAssets `json:"assets"`
}
type InventoryAssets struct {
ClassID string `json:"classid"`
InstanceID string `json:"instanceid"`
IconURL string `json:"icon_url"`
Name string `json:"name"`
MarketHashName string `json:"market_hash_name"`
AssetRarity string `json:"rarity"`
AssetBorderColor string `json:"border_color"`
AssetExterior string `json:"exterior"`
AssetQuality string `json:"asset_quality"`
AppID int `json:"appid"`
AssetPrice int `json:"asset_price"`
Marketable int `json:"marketable"`
AssetCount int `json:"item_count"`
AssetTotalCost int `json:"asset_total_price"`
}
после того как ее создаю я, записываю в хранилище Redis следующим образом
err := client.Set(ctx, "key", myStruct, time.Minute)
// отработка err
далее я пытаюсь достать данную структуру следующим образом
newStruct := myStruct{}
err := client.Get(ctx, "key").Scan(&newStruct)
// отработка err
в итоге на выходе получается пустая структура
{0 0 [] { } map[]}
ps. методы структуры "MarshalBinary" и "UnmarshalBinary" прописаны.
Использую go-redis/v9.
Как мне правильно достать структуру из хранилища редис?
Ответы (2 шт):
Вопрос решил по своему, почему то такая данный метод у меня не работает:
newStruct := myStruct{}
err := client.Get(ctx, "key").Scan(&newStruct)
Как мне подсказали люди необходимо дампить структуру в JSON самостоятельно и при вызове из кеша десериализовывать данные. Код вынес в отдельные функции.
Код для добавления структуры/JSON в БД.
func RDCSetUser(ctx context.Context, rdc *redis.Client, key string, value interface{}) error {
b, err := json.Marshal(value)
if err != nil {
fmt.Println("Ошибка в джсон")
}
return rdc.Set(ctx, key, b, time.Minute*10).Err()
}
Код для получения данных из БД.
func RDCGetUser(ctx context.Context, rdc *redis.Client, key string, dest interface{}) error {
b, err := rdc.Get(ctx, key).Bytes()
if err != nil {
fmt.Println("Ошибка в анджсон")
}
return json.Unmarshal(b, dest)
}
Еще раз разобрался библиотека go-redis встроено поддерживает сериализацию/десериализацию, для того чтобы работал данный метод:
newStruct := myStruct{}
err := client.Get(ctx, "key").Scan(&newStruct)
нужно по нормальному прописать маршаллер и анмаршаллер у указанной струкутры
сделать нужно следующим образом:
func (i myStruct) MarshalBinary() ([]byte, error) {
return json.Marshal(i)
}
func (i *myStruct) UnmarshalBinary(data []byte) error {
return json.Unmarshal(data, &i)
}