Использование вторичных индексов в базе данных Redis по сравнению с операторами SQL

Я работаю с базой данных Redis. Я уже реализовал код Python для доступа к серверу Redis. Проблема в том, что реализованный код очень сложен и не прост в сопровождении.

Вторичные индексы в базе данных Redis

Чтобы упростить вопрос, я предполагаю, что в моей базе данных присутствует набор из 4 ключей, вставленных следующими командами:

hset key:1 id 1 field1 1001
hset key:2 id 2 field1 999
hset key:3 id 3 field1 1002
hset key:4 id 4 field1 1000

Предыдущий набор ключей упорядочен по полю id. Я использовал Руководство по вторичному индексированию документации Redis для реализации вторичного индекса, чтобы получить список ключей, упорядоченный по field1.
Для этого, согласно руководству , я создал внутри базы данных отсортированный набор с именем zfield1 с помощью следующих команд:

zadd zfield1 1001 1
zadd zfield1 999 2
zadd zfield1 1002 3
zadd zfield1 1000 4

Отсортированный набор zfield1 упорядочен по полю field1.

С помощью команды zrange я получаю список полей id, упорядоченных по field1:

zrange zfield1 0 -1
1) "2"
2) "4"
3) "1"
4) "3"

Первым элементом списка, полученного zrange, является "2", и этот элемент предоставляет информацию для получения всех значений ключа с меньшим значением field1. Итак, с помощью следующей команды я могу получить все значения ключей, относящиеся к key:2:

hgetall key:2
1) "id"
2) "2"
3) "field1"
4) "999"

С подходящим циклом, который выполняет команду hgetall, я могу получить все ключевые значения, упорядоченные field1.

Сравните с базой данных SQL

Я думаю, что предыдущая презентация — это реализация следующего SQL-запроса (где TABLE1 — это таблица в общей базе данных SQL):

SELECT * from TABLE1 order by field1

Это первый раз, когда я использую Redis, и если сравнивать его с SQL-запросом, я думаю, что его использование является более сложным в отношении базы данных SQL. Поэтому я сомневаюсь, что есть другие более простые способы реализации SQL-запроса, такие как SELECT * from TABLE1 order by field1 с Redis.

Вопрос

Кто-нибудь может сказать, есть ли другие команды Redis (например, конкретное использование команды Redis KEYS), которые помогают получить ключи, упорядоченные по вторичному индексу?

Примечание: полезные ссылки по этой теме также приветствуются.

Вы проверили модуль RediSearch для Redis (часть Redis-Stack)?

Guy Korland 24.11.2022 12:58

Я нашел это в своем поиске решений, но я не использовал его. Как вы думаете, это может помочь сделать запрос (иногда сложный) более простым способом?

frankfalse 24.11.2022 14:24

Конечно, RediSearch предоставляет вам очень обширный API запросов. См.: redis.io/commands/ft.search redis.io/commands/ft.aggregate

Guy Korland 25.11.2022 22:48
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
103
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Действительно: главной целью Redis является производительность, и его структуры данных и команды разработаны с учетом этого. В Redis нет встроенных вторичных индексов, так как их сохранение будет иметь незначительную стоимость: на самом деле, руководство, на которое вы ссылались, показывает шаблон, который вы можете использовать для имитации одного, поскольку используемый там тип данных — это просто отсортированный set — первый гражданин в экосистеме Redis. Реляционная база данных — это совершенно другой зверь.

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

Спасибо, ваш ответ говорит мне, что я думаю, что я правильно использую Redis, на самом деле, когда я создаю/изменяю/удаляю ключи, я поддерживаю несколько отсортированных наборов. Если я сошлюсь на свой вопрос, мне нужно выполнить запросы, которые выбирают ключи по интервалу даты и времени, а выбранные ключи должны быть возвращены по другому индексу, который в примере равен field1. Это означает, что я создал 2 отсортированных ключа и много строк кода, чтобы получить результат. Иногда я думаю, что это не тот инструмент, но на данный момент я должен продолжать. Спасибо, и если вы можете добавить некоторые другие советы.

frankfalse 21.11.2022 23:13

Пожалуйста. Я считаю, что Redis — отличный инструмент: считать ли его правильным продуктом или нет, зависит от потребностей вашего бизнеса. Если вы можете позволить себе покинуть зону комфорта SQL, чтобы использовать другую модель и типы данных с целью повышения скорости вашей системы, тогда да, Redis действительно может быть правильным инструментом. Но я считаю, что реляционные базы данных также являются отличным решением. Возможно, вы могли бы рассмотреть возможность использования в своем приложении как SQL, так и NOSQL, чтобы получить максимальную отдачу от этих двух категорий.

Efran Cobisi 22.11.2022 07:26

Другие вопросы по теме