我正在使用這個函數來按狀態獲取訂單,這個函數的問題在于,過濾發生在我從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 關注
- 214 瀏覽
添加回答
舉報
0/150
提交
取消