在 Redis 中按值进行筛选(使用 go 和 redis-go)

我正在使用这个函数来按状态获取订单,这个函数的问题在于,过滤发生在我从redis获得所有订单之后,是否有一种方法可以像Postgres(例如where语句)那样按值redis端进行过滤,或者redis不支持吗?


func (r *queryResolver) OrdersByStatus(ctx context.Context, status string) ([]*models.Order, error) {

    defer utils.Elapsed("redis query => orders")()


    myCtx := ctx.Value(constants.KMyContext).(types.MyCtx)


    sessionData, sessionErr := session.GetSessionData(myCtx.ResponseWriter, myCtx.Request, constants.KCurrentUser)


    if sessionErr != nil {

        return nil, sessionErr

    }


    marshalledStories, err := cache.RedisClient.Get(ctx, constants.KOrders+sessionData.UUID).Result()

    if err != nil {

        log.Println("redis get err", err)

        return nil, errors.New(constants.InternalServerError)

    }

    var orders []*models.Order


    unmarshallErr := json.Unmarshal([]byte(marshalledStories), &orders)


    if unmarshallErr != nil {

        log.Println("redis unmarshallErr", unmarshallErr)

        return nil, errors.New(constants.InternalServerError)

    }


    var filtered []*models.Order


    for _, u := range orders {

        if u.Status == status {

            filtered = append(filtered, u)

        }

    }


    return filtered, nil

}


眼眸繁星
浏览 194回答 2
2回答

慕神8447489

我会使用 https://github.com/tidwall/gjson 来查询编组的故事

杨__羊羊

由于在单个键上存储序列化的 JSON 数组,因此最接近的是运行 Lua 脚本,该脚本使用该脚本解析存储在键上的 JSON,根据值筛选条目,然后重新序列化结果并将其保存在相同键或不同键上。这将更快,因为它将完全在Redis服务器上执行,但也更难调试/更容易出错。EVALstatus您可以使用 来解析 JSON 并重新序列化它。cjson.decodecjson.encode像这样:local myKey = KEYS[1]local status = ARGV[1]local raw = redis.call("GET", myKey)local orders = cjson.decode(raw)local filteredOrders = {}local index = 1for order, _ in ipairs(orders) do  if order["status"] == status then    filteredOrders[index] = order    index = index + 1  endendlocal resultRaw = cjson.encode(filteredOrders)redis.call("SET", myKey, resultRaw)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go