Я работаю с базой данных Redis. Я уже реализовал код Python для доступа к серверу 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-запроса (где TABLE1
— это таблица в общей базе данных SQL):
SELECT * from TABLE1 order by field1
Это первый раз, когда я использую Redis, и если сравнивать его с SQL-запросом, я думаю, что его использование является более сложным в отношении базы данных SQL.
Поэтому я сомневаюсь, что есть другие более простые способы реализации SQL-запроса, такие как SELECT * from TABLE1 order by field1
с Redis.
Кто-нибудь может сказать, есть ли другие команды Redis (например, конкретное использование команды Redis KEYS
), которые помогают получить ключи, упорядоченные по вторичному индексу?
Примечание: полезные ссылки по этой теме также приветствуются.
Я нашел это в своем поиске решений, но я не использовал его. Как вы думаете, это может помочь сделать запрос (иногда сложный) более простым способом?
Конечно, RediSearch предоставляет вам очень обширный API запросов. См.: redis.io/commands/ft.search redis.io/commands/ft.aggregate
Это первый раз, когда я использую Redis, и если я сравниваю его с запросом SQL, я думаю, что его использование является более сложным в отношении базы данных SQL.
Действительно: главной целью Redis является производительность, и его структуры данных и команды разработаны с учетом этого. В Redis нет встроенных вторичных индексов, так как их сохранение будет иметь незначительную стоимость: на самом деле, руководство, на которое вы ссылались, показывает шаблон, который вы можете использовать для имитации одного, поскольку используемый там тип данных — это просто отсортированный set — первый гражданин в экосистеме Redis. Реляционная база данных — это совершенно другой зверь.
Если вы хотите использовать несколько индексов в Redis, я бы предложил создать и поддерживать несколько ключей (можно использовать вышеупомянутый тип данных отсортированного набора), пока вы создаете/изменяете/удаляете свои основные ключи.
Спасибо, ваш ответ говорит мне, что я думаю, что я правильно использую Redis, на самом деле, когда я создаю/изменяю/удаляю ключи, я поддерживаю несколько отсортированных наборов. Если я сошлюсь на свой вопрос, мне нужно выполнить запросы, которые выбирают ключи по интервалу даты и времени, а выбранные ключи должны быть возвращены по другому индексу, который в примере равен field1
. Это означает, что я создал 2 отсортированных ключа и много строк кода, чтобы получить результат. Иногда я думаю, что это не тот инструмент, но на данный момент я должен продолжать. Спасибо, и если вы можете добавить некоторые другие советы.
Пожалуйста. Я считаю, что Redis — отличный инструмент: считать ли его правильным продуктом или нет, зависит от потребностей вашего бизнеса. Если вы можете позволить себе покинуть зону комфорта SQL, чтобы использовать другую модель и типы данных с целью повышения скорости вашей системы, тогда да, Redis действительно может быть правильным инструментом. Но я считаю, что реляционные базы данных также являются отличным решением. Возможно, вы могли бы рассмотреть возможность использования в своем приложении как SQL, так и NOSQL, чтобы получить максимальную отдачу от этих двух категорий.
Вы проверили модуль RediSearch для Redis (часть Redis-Stack)?