在Redis中按值过滤(使用go和Redis go)

在Redis中按值过滤(使用go和Redis go),go,redis,Go,Redis,我使用这个函数来按状态获取订单,这个函数的问题是,在我从redis获取所有订单后,会进行过滤。有没有一种方法可以像Postgres(例如where语句)那样按redis端的值进行过滤,或者redis不支持 func(r*queryResolver)OrdersByStatus(ctx context.context,状态字符串)([]*models.Order,错误){ defer utils.appead(“redis query=>orders”)() myCtx:=ctx.Value(co

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

func(r*queryResolver)OrdersByStatus(ctx context.context,状态字符串)([]*models.Order,错误){
defer utils.appead(“redis query=>orders”)()
myCtx:=ctx.Value(constants.KMyContext)。(types.myCtx)
sessionData,sessioner:=session.GetSessionData(myCtx.ResponseWriter,myCtx.Request,constants.KCurrentUser)
如果sessioner!=nil{
返回零,sessioner
}
marshalledStories,err:=cache.RedisClient.Get(ctx,constants.KOrders+sessionData.UUID).Result()
如果错误!=零{
Println(“redis get err”,err)
返回nil,errors.New(constants.InternalServerError)
}
var orders[]*models.Order
unmarshallErr:=json.Unmarshal([]字节(marshalledStories),&orders)
如果解组错误!=nil{
Println(“redis unmarshaller”,unmarshaller)
返回nil,errors.New(constants.InternalServerError)
}
var筛选[]*models.Order
对于u,u:=范围订单{
如果u.Status==Status{
过滤=附加(过滤,u)
}
}
返回过滤,无
}

在一个键上存储序列化JSON数组之后,最接近的方法是使用
EVAL
运行Lua脚本,该脚本解析存储在该键上的JSON,根据
状态
值过滤条目,然后在同一个键或不同的键上重新序列化并保存结果。这将更快,因为它将完全在Redis服务器上执行,但也更难调试/更容易出错

您可以使用
cjson.decode
解析JSON,并使用
cjson.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)

我将使用查询marshalledStories

您是否尝试使用MATCH语句运行自定义命令?我认为一般来说,这不是Redis的用例。不,我还没有尝试匹配语句。你能给我举个例子吗?对不起,我忘了这只对键有效,你不能在Redis端按值过滤。这应该还是很快的。我想这是最好的解决方法,谢谢