Golang - 缓存返回 base 64 constricted
Golang - Ristretto Cache returning base 64
我在使用 ristretto 缓存时遇到问题。事实上,我有一点 api 应该 return 我在我的 ristretto 缓存中存储一个值 json.
问题是当我调用我的函数时,return 是用 base64 编码的 json,我就是找不到解码它的方法。
这是我的代码:
- 第 1 部分:初始化我的 ristretto 缓存的代码:
func InitCache() {
var err error
ristrettoCache, err = ristretto.NewCache(&ristretto.Config{
NumCounters: 3000,
MaxCost: 1e6,
BufferItems: 64,
})
if err != nil {
panic(err)
}
}
第 2 部分:将我的值放入缓存:
for _, t := range listTokensFromDB {
b, err := json.Marshal(t)
if err != nil {
fmt.Println(err)
}
ristrettoCache.Set(t.Symbol, b, 1)
}
第 3 部分:从缓存中获取值
func getTokenInfo(w http.ResponseWriter, r *http.Request){
vars := mux.Vars(r)
key := vars["chain"]+vars["symbol"]
value, found := ristrettoCache.Get(key)
if !found {
return
}
json.NewEncoder(w).Encode(value)
}
我打电话给 api 时得到的结果是:
"eyJTeW1ib2wiOiJic2NDUllQVE8iLCJBZGRyIjoiMHgyQmNBMUFlM0U1MjQ0NzMyM0IzRWE0NzA4QTNkMTg1ODRDYWY4NWE3IiwiTHBzIjpbeyJTeW1ib2xUb2tlbiI6IkZFRyIsIlRva2VuQWRkciI6IjB4YWNGQzk1NTg1RDgwQWI2MmY2N0ExNEM1NjZDMWI3YTQ5RmU5MTE2NyIsIkxwQWRkciI6IjB4NDU5ZTJlMjQ4NGNlMDU2MWRmNTJiYzFlNjkxMzkyNDA2M2JhZDM5MCJ9LHsiU3ltYm9sVG9rZW4iOiJmQk5CIiwiVG9rZW5BZGRyIjoiMHg4N2IxQWNjRTZhMTk1OEU1MjIyMzNBNzM3MzEzQzA4NjU1MWE1Yzc2IiwiTHBBZGRyIjoiMHg3OGM2NzkzZGMxMDY1OWZlN2U0YWJhMTQwMmI5M2Y2ODljOGY0YzI3In1dfQ=="
但是我想要base64解码的版本...
如果我在将值 b 插入缓存时将值 b 更改为字符串,如下所示:
for _, t := range listTokensFromDB {
b, err := json.Marshal(t)
if err != nil {
fmt.Println(err)
}
ristrettoCache.Set(t.Symbol, string(b), 1)
}
当我收到回复时,我得到了字符串化的 json,如下所示:
"{"Symbol":"bscCRYPTO","Addr":"0x2BcA1Ae3E52447323B..."
而且我找不到摆脱这个字符串的方法:/
有人知道我怎样才能得到真正的json吗?
提前谢谢你,祝你有个愉快的一天!
根据我的评论,我的意思是,在这一行中,value
最有可能是 []byte
类型(或 []uint8
- 这是同一件事)
value, found := ristrettoCache.Get(key)
JSON 编码 []byte
将隐式 base64 输出 - 因为 JSON 是基于文本的。
json.NewEncoder(w).Encode(value) // <- value is of type []byte
检查您发布的 base64 (https://play.golang.org/p/NAVS4qRfDM2),底层二进制字节已经编码为 JSON - 因此不需要额外的 json.Encode
。
只需在您的处理程序中输出原始字节 - 并将内容类型设置为 application/json
:
func getTokenInfo(w http.ResponseWriter, r *http.Request){
vars := mux.Vars(r)
key := vars["chain"]+vars["symbol"]
value, found := ristrettoCache.Get(key)
if !found {
return
}
// json.NewEncoder(w).Encode(value) // not this
w.Header().Set("Content-Type", "application/json")
if bs, ok := value.([]byte); ok {
_, err := w.Write(bs) //raw bytes (already encoded in JSON)
// check 'err'
} else {
// error unexpected type behind interface{}
}
}
我在使用 ristretto 缓存时遇到问题。事实上,我有一点 api 应该 return 我在我的 ristretto 缓存中存储一个值 json.
问题是当我调用我的函数时,return 是用 base64 编码的 json,我就是找不到解码它的方法。
这是我的代码:
- 第 1 部分:初始化我的 ristretto 缓存的代码:
func InitCache() {
var err error
ristrettoCache, err = ristretto.NewCache(&ristretto.Config{
NumCounters: 3000,
MaxCost: 1e6,
BufferItems: 64,
})
if err != nil {
panic(err)
}
}
第 2 部分:将我的值放入缓存:
for _, t := range listTokensFromDB {
b, err := json.Marshal(t)
if err != nil {
fmt.Println(err)
}
ristrettoCache.Set(t.Symbol, b, 1)
}
第 3 部分:从缓存中获取值
func getTokenInfo(w http.ResponseWriter, r *http.Request){
vars := mux.Vars(r)
key := vars["chain"]+vars["symbol"]
value, found := ristrettoCache.Get(key)
if !found {
return
}
json.NewEncoder(w).Encode(value)
}
我打电话给 api 时得到的结果是:
"eyJTeW1ib2wiOiJic2NDUllQVE8iLCJBZGRyIjoiMHgyQmNBMUFlM0U1MjQ0NzMyM0IzRWE0NzA4QTNkMTg1ODRDYWY4NWE3IiwiTHBzIjpbeyJTeW1ib2xUb2tlbiI6IkZFRyIsIlRva2VuQWRkciI6IjB4YWNGQzk1NTg1RDgwQWI2MmY2N0ExNEM1NjZDMWI3YTQ5RmU5MTE2NyIsIkxwQWRkciI6IjB4NDU5ZTJlMjQ4NGNlMDU2MWRmNTJiYzFlNjkxMzkyNDA2M2JhZDM5MCJ9LHsiU3ltYm9sVG9rZW4iOiJmQk5CIiwiVG9rZW5BZGRyIjoiMHg4N2IxQWNjRTZhMTk1OEU1MjIyMzNBNzM3MzEzQzA4NjU1MWE1Yzc2IiwiTHBBZGRyIjoiMHg3OGM2NzkzZGMxMDY1OWZlN2U0YWJhMTQwMmI5M2Y2ODljOGY0YzI3In1dfQ=="
但是我想要base64解码的版本...
如果我在将值 b 插入缓存时将值 b 更改为字符串,如下所示:
for _, t := range listTokensFromDB {
b, err := json.Marshal(t)
if err != nil {
fmt.Println(err)
}
ristrettoCache.Set(t.Symbol, string(b), 1)
}
当我收到回复时,我得到了字符串化的 json,如下所示: "{"Symbol":"bscCRYPTO","Addr":"0x2BcA1Ae3E52447323B..."
而且我找不到摆脱这个字符串的方法:/
有人知道我怎样才能得到真正的json吗?
提前谢谢你,祝你有个愉快的一天!
根据我的评论,我的意思是,在这一行中,value
最有可能是 []byte
类型(或 []uint8
- 这是同一件事)
value, found := ristrettoCache.Get(key)
JSON 编码 []byte
将隐式 base64 输出 - 因为 JSON 是基于文本的。
json.NewEncoder(w).Encode(value) // <- value is of type []byte
检查您发布的 base64 (https://play.golang.org/p/NAVS4qRfDM2),底层二进制字节已经编码为 JSON - 因此不需要额外的 json.Encode
。
只需在您的处理程序中输出原始字节 - 并将内容类型设置为 application/json
:
func getTokenInfo(w http.ResponseWriter, r *http.Request){
vars := mux.Vars(r)
key := vars["chain"]+vars["symbol"]
value, found := ristrettoCache.Get(key)
if !found {
return
}
// json.NewEncoder(w).Encode(value) // not this
w.Header().Set("Content-Type", "application/json")
if bs, ok := value.([]byte); ok {
_, err := w.Write(bs) //raw bytes (already encoded in JSON)
// check 'err'
} else {
// error unexpected type behind interface{}
}
}