Golang Ristretto缓存返回Base64或转义JSON问题如何解决
问题原因
返回结果异常是因为重复执行了JSON序列化:
- 写入缓存前你已经通过
json.Marshal将结构体转为了合法的JSON字节流 - 读取缓存后又调用
json.NewEncoder(w).Encode()对数据做了二次序列化:- 缓存值为
[]byte类型时,JSON序列化规则会将字节数组编码为Base64字符串,对应你第一次拿到的返回结果 - 缓存值为
string类型时,JSON序列化规则会给字符串包裹双引号,对应你第二次拿到的带外层引号的结果
- 缓存值为
解决方案
直接将缓存中取出的原始JSON字节流写入响应即可,无需二次序列化,修改getTokenInfo函数代码如下:
func getTokenInfo(w http.ResponseWriter, r *http.Request){ vars := mux.Vars(r) // 注意:当前写入缓存用的key是t.Symbol,读取时拼接了chain参数,需自行对齐key规则,否则会出现找不到缓存的问题 key := vars["chain"]+vars["symbol"] value, found := ristrettoCache.Get(key) if !found { http.NotFound(w, r) return } // 类型断言为写入缓存时的[]byte类型 jsonBytes, ok := value.([]byte) if !ok { http.Error(w, "缓存数据类型错误", http.StatusInternalServerError) return } // 设置正确的响应头 w.Header().Set("Content-Type", "application/json") // 直接写入原始JSON字节 _, err := w.Write(jsonBytes) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } }
调整后缓存写入逻辑无需修改,保持存[]byte即可。
内容的提问来源于stack exchange,提问作者akamob
相关产品推荐
相关产品推荐

