我正在使用这个函数来按状态获取订单,这个函数的问题在于,过滤发生在我从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}
2 回答
杨__羊羊
TA贡献1943条经验 获得超7个赞
由于在单个键上存储序列化的 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 = 1
for order, _ in ipairs(orders) do
if order["status"] == status then
filteredOrders[index] = order
index = index + 1
end
end
local resultRaw = cjson.encode(filteredOrders)
redis.call("SET", myKey, resultRaw)
- 2 回答
- 0 关注
- 182 浏览
添加回答
举报
0/150
提交
取消