为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
眼眸繁星 2022-08-24 16:42:52
我正在使用这个函数来按状态获取订单,这个函数的问题在于,过滤发生在我从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 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

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


查看完整回答
反对 回复 2022-08-24
?
杨__羊羊

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)


查看完整回答
反对 回复 2022-08-24
  • 2 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信