```
//GetHMapData 从数据库获取数据
type GetHMapData interface {
RedisKey() string
LoadDb() error
// SaveCache() error
}
//LoadCache 从缓存获取数据
func LoadCache(hd GetHMapData) error {
cli := redis.GetCacheConn()
bookMap := cli.HGetAll(hd.RedisKey()).Val()
return redis.CoverMapToStruct(bookMap, &hd)
}
//GetData 获取数据
func GetData(hd GetHMapData) error {
if err := LoadCache(hd); err != nil {
log.Log.Errorf("load db err:", err)
if err := hd.LoadDb(); err != nil {
return err
}
SaveCache(hd)
}
return nil
}
//SaveCache 将Hmap存入redis
func SaveCache(u GetHMapData) error {
uMap, err := redis.StructToMap(u)
if err != nil || uMap == nil {
log.Log.Errorf("保存缓存数据出错:%v", err)
return err
}
cli := redis.GetCacheConn()
err = cli.HMSet(u.RedisKey(), uMap).Err()
if err != nil {
log.Log.Errorf("保存缓存数据出错:%v", err)
return err
}
cli.Expire(u.RedisKey(), constent.DefaultExpire)
return nil
}
```
想实现一个接口,完成从数据库查数据,取不到就查数据库的功能
这个是redis这边两个函数的实现
```
//CoverMapToStruct 将redis取出的数据转成简单结构体
func CoverMapToStruct(data map[string]string, s interface{}) error {
buf, err := json.Marshal(data)
if err != nil {
return err
}
return json.Unmarshal(buf, s)
}
//StructToMap 将结构体转成map存入redis
func StructToMap(s interface{}) (map[string]interface{}, error) {
buf, err := json.Marshal(s)
if err != nil {
return nil, err
}
dest := make(map[string]interface{})
err = json.Unmarshal(buf, &dest)
if err != nil {
return nil, err
}
return dest, nil
}
```
现在无法实现该功能,求指教我这个思路哪里出错了?
有疑问加站长微信联系(非本文作者)