AFAIK - Это почти невозможно сделать с 1 запросом в Redis.Вы пытаетесь использовать хранилище ключей в качестве реляционной базы данных.Есть способ сделать это в Redis, но с двумя запросами.Однако вы можете заключить его в одну транзакцию в MULTI / EXEC
и, таким образом, сделать его одним запросом.
Например:
Создать еще 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 и не страдает от больших проблем с производительностью.Вы можете проверить здесь для другого подобного примера, если мое объяснение не ясно.
Надеюсь, это поможет