You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang Ristretto缓存返回Base64或转义JSON问题如何解决

问题原因

返回结果异常是因为重复执行了JSON序列化:

  1. 写入缓存前你已经通过json.Marshal将结构体转为了合法的JSON字节流
  2. 读取缓存后又调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 21:27:00