Redis, как объединить несколько команд в 1 запрос - PullRequest
2 голосов
/ 20 марта 2019

Как запросить

  • красный феррари с ограниченным тиражом
  • с верхней скоростью от 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,[]]

Что такоея делаю неправильно, как запросить несколько команд 1 за другой?

Ответы [ 2 ]

1 голос
/ 25 марта 2019

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 и не страдает от больших проблем с производительностью.Вы можете проверить здесь для другого подобного примера, если мое объяснение не ясно.

Надеюсь, это поможет

0 голосов
/ 27 марта 2019

Возможно EVAL - это то, что вы ищете?(возможно, нет) ..

Он использует LUA-скрипты для выполнения пакета команд за один вызов (и, при необходимости, для возврата результата).Это ВИД, как хранимая процедура для REDIS.Загруженный LUA кэшируется, поэтому вам не нужно загружать его снова и снова.

Примеры, которые я вижу, не являются ТОЧНО тем, что вы ищете, но демонстрируют многокомпонентные запросы.Вы должны прочитать в них, чтобы увидеть мясо, прежде чем отказаться от EVAL (я почти сделал).

Объектные запросы с Redis

Руководство по скорости для сценариев Redis Lua

EVAL (из документации redis)

Единственная причина, которую я знаюЭто связано с тем, что коллега здесь настаивает на использовании Redis в качестве реляционной базы данных.Это мало чем отличается от использования молотка в качестве отвертки.

...