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

时间:2019-03-20 03:44:21

标签: redis node-redis

如何查询

  • 限量版红色法拉利
  • 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,[]]

我在做什么错,如何用多个命令依次查询?

2 个答案:

答案 0 :(得分:1)

AFAIK-在Redis中使用1个查询几乎是不可能的。您正在尝试将键值存储用作关系数据库。在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的另一个类似示例。

希望这会有所帮助

答案 1 :(得分:0)

也许正在寻找 EVAL ? (也许不是)。

它使用 LUA脚本 在一个调用中执行一批命令(并有选择地返回结果)。 它就像REDIS的存储过程一样。上传的LUA已缓存,因此您无需一遍又一遍地加载它。

我看到的示例并非您所要查找的,而是演示了多部分查询。在您放弃EVAL之前,您需要通读它们才能看到肉(我几乎做过)。

Object Queries with Redis

A Speed Guide To Redis Lua Scripting

EVAL (from the redis docs)

我对此唯一了解的原因是, 坚持 的同事在此使用redis作为关系数据库。这与使用锤子作为螺丝起子没什么不同。