如何查询
数据
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,[]]
我在做什么错,如何用多个命令依次查询?
答案 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之前,您需要通读它们才能看到肉(我几乎做过)。
A Speed Guide To Redis Lua Scripting
我对此唯一了解的原因是, 坚持 的同事在此使用redis作为关系数据库。这与使用锤子作为螺丝起子没什么不同。