redis如何在1个查询中组合多个命令

问题描述 投票:2回答:2

如何查询

  • 红色法拉利限量版
  • topSpeed介于200到210之间
  • 价格在190到205之间

数据

HMSET cars:1 make ferrari Price 199 limited yes color red topSpeed 202
HMSET cars:2 make porsche Price 555 limited no color yellow topSpeed 500

SADD make:ferrari 1
SADD color:red 1
SADD limited:yes 1
ZADD Price 199 1
ZADD topSpeed 202 1

SADD make:porsche 2
SADD color:yellow 2
SADD limited:no 2
ZADD Price 555 2
ZADD topSpeed 500 2

我试过并且不知道如何为价格和topSpeed添加多个范围?

multi.ZINTERSTORE('tempTom',4,
'color:red',
'make:ferrari',
'limited:yes',
'topSpeed'
);

multi.ZRANGEBYSCORE('tempTom' , 202 ,205) //range for topSpeed

//so how to add range for Price also ?

产量

[1,[]]

我做错了什么,如何一个接一个地查询多个命令?

redis node-redis
2个回答
1
投票

AFAIK - 在Redis中使用1个查询几乎不可能。您正在尝试将key-vale存储用作关系数据库。有一种方法可以在Redis中进行,但有2个查询。但是,您可以将其作为单个事务包装在MULTI / EXEC中,从而有效地使其成为1个查询。

例如:

再创建2套,一套用于topSpeed,另一套用于price。然后在这两者之间执行SINTER(第一次查询)。然后使用该结果查询您的car(第二个查询)。

说明:

# Inserting cars top speed
ZADD car:top-speed:210 "ferrari"
ZADD car:top-speed:300 "porsche"

# Inserting cars price (e.g. both cars have the same price)
ZADD car:price:190 "ferrari" "porsche"

# Using SINTER to get all cars with top speed of 210 and a price of 190
SINTER car:top-speed:210 car:price:300 // output "ferrari"

使用输出查询您的car集并获取所有其他详细信息(不要忘记MULTI / EXEC)。

您可以通过简单地添加更多集合并在所有集合上执行交集来添加更多“过滤器”。但是,无论何时添加新车,您都必须填充所有这些集。但这在Redis中是正常的,并且不会遇到大的性能问题。如果我的解释不清楚,你可以检查here的另一个类似的例子。

希望这可以帮助


0
投票

也许EVAL是你在找什么? (也许不是)..

它使用LUA脚本在一次调用中执行一批命令(并可选择返回结果)。它就像REDIS的存储过程一样。上传的LUA会被缓存,因此您无需反复加载它。

我看到的示例并不完全是您正在寻找的,但演示了多部分查询。在放弃EVAL之前,你需要阅读它们才能看到肉(我差不多了)。

Object Queries with Redis

A Speed Guide To Redis Lua Scripting

EVAL (from the redis docs)

我知道这个的唯一原因是因为这里的同事坚持使用redis作为关系数据库。它与使用锤子作为螺丝刀没有什么不同。

© www.soinside.com 2019 - 2024. All rights reserved.