Redis как объединить несколько команд в 1 запрос

Как сделать запрос

  • красный феррари с ограниченным тиражом
  • с 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

Я пробовал и не знаю, как добавить несколько диапазонов для price и 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 за другой?


person vijay    schedule 20.03.2019    source источник


Ответы (2)


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

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

person Urosh T.    schedule 25.03.2019

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

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

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

Запросы объектов с помощью Redis

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

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

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

person Señor CMasMas    schedule 27.03.2019