本地缓存用的是freecache
用go的指针将struct转成[]byte存储到本地缓存中再取出来的时候会出现转成的结构体乱码的问题
做得是web端的项目,在本地单次请求的时候不会出现转出来的数据乱码的情况,但用jmeter测试时会出现问题。
func GetUserinfo(userid string, opts *config.Options) (*Userinfo, error) {
key := []byte(fmt.Sprintf(UserInfoCacheKey, userid))
out := &Userinfo{}
userinfo, err := config.Cache.Get(key)
if err != nil {
if err := sdk.Invoke(opts.BizUserProfileAppID, "get_user_info", struct {
Prod string `json:"prod"`
Userid string `json:"user_id"`
}{opts.Prod, userid}, out); err != nil {
return nil, err
}
size := unsafe.Sizeof(*out)
sliceHeader := reflect.SliceHeader{
Data: uintptr(unsafe.Pointer(out)),
Len: int(size),
Cap: int(size),
}
bytes := *(*[]byte)(unsafe.Pointer(&sliceHeader))
err := config.Cache.Set(key, bytes, 120)
if err != nil {
log.Println("设置缓存失败:", err)
}
return out, nil
} else {
out = *(**Userinfo)(unsafe.Pointer(&userinfo))
fmt.Printf("%d userinfo: %+v\n", a, out)
return out, nil
}
}