-
Notifications
You must be signed in to change notification settings - Fork 701
YDB FQ: docs for Redis
as an external data source
#17187
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
# Работа с базами данных Redis | ||
|
||
В этом разделе описана основная информация про работу с внешней `NoSQL` базой данных [Redis](https://redis.io/), которая представляет собой `in-memory` `key-value` хранилище. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. В этой строчке надо убрать подсветку кода, она ни к чему. Англицизмы, которые имеют явные русские аналоги, надо тоже убрать. Например key value можно переделать в база данных типа "ключ-значение". |
||
|
||
Для работы с внешней базой данных Redis необходимо выполнить следующие шаги: | ||
|
||
1. Создать [секрет](../datamodel/secrets.md), содержащий пароль для подключения к базе данных. | ||
|
||
```yql | ||
CREATE OBJECT redis_datasource_user_password (TYPE SECRET) WITH (value = "<password>"); | ||
``` | ||
|
||
1. Создать [внешний источник данных](../datamodel/external_data_source.md), описывающий определённую базу данных Redis. Включить шифрование соединений к внешней базе данных можно с помощью параметра `USE_TLS="TRUE"`. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. В этом абзаце надо расписать смысл всех параметров. Пример https://ydb.tech/docs/ru/concepts/federated_query/ms_sql_server |
||
|
||
```yql | ||
CREATE EXTERNAL DATA SOURCE external_data_source WITH ( | ||
SOURCE_TYPE="Redis", | ||
LOCATION="<host>:<port>", | ||
DATABASE_NAME="<database>", | ||
AUTH_METHOD="BASIC", | ||
LOGIN="default", | ||
PASSWORD_SECRET_NAME="redis_datasource_user_password", | ||
--PROTOCOL="NATIVE", | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. раз работает без него, убираем |
||
USE_TLS="FALSE" | ||
); | ||
``` | ||
|
||
1. {% include [!](_includes/connector_deployment.md) %} | ||
1. [Выполнить запрос](#query) к базе данных. | ||
|
||
## Синтаксис запросов {#query} | ||
|
||
Для работы с Redis используется следующая форма SQL-запроса: | ||
|
||
```yql | ||
SELECT * FROM redis_datasource.`<key_prefix:*>` | ||
``` | ||
|
||
где: | ||
|
||
- `redis_datasource` - идентификатор внешнего источника данных; | ||
- `<key_prefix>` - префикс ключа внешнего источника данных. | ||
|
||
например, если у вас в Redis ключи: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Избегай в рассуждениях местоимений "вы" / "мы". Язык этого документа должен быть максимально сухым и техническим. |
||
``` | ||
sample_session:1 | ||
sample_session:2 | ||
sample_session:3 | ||
user:email:1 | ||
user:email:2 | ||
user:email:3 | ||
Comment on lines
+49
to
+51
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Сделай примеры с реальными почтовыми адресами |
||
``` | ||
|
||
то вы можете получить все ключи `sample_session` следующим образом: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ключи с префиксом |
||
|
||
```yql | ||
SELECT * FROM redis_datasource.`sample_session:*` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Перед этим примером сделай пример, как вычитать все ключи. |
||
``` | ||
|
||
## Ограничения | ||
|
||
При работе с Redis существует ряд ограничений: | ||
|
||
1. {% include [!](_includes/supported_requests.md) %} | ||
|
||
2. Система обработки федеративных запросов {{ ydb-short-name }} умеет передавать исполнение некоторых частей запроса системе, выступающей в качестве источника данных. Фрагменты запроса передаются сквозь {{ ydb-short-name }} непосредственно во внешнюю систему и обрабатываются внутри неё. С помощью этой оптимизации, которая носит название «пушдауна предикатов» (predicate pushdown), удаётся значительно снизить объём данных, передаваемых от источника к движку обработки федеративных запросов. Благодаря этому снижается нагрузка на сеть и экономятся вычислительные ресурсы {{ ydb-short-name }}. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. В нумерованных списках все пункты начинаются с единицы - такой синтаксис |
||
|
||
В случае с Redis производится пушдаун фильтрации по `<key_prefix>`, описанной выше. | ||
Comment on lines
+66
to
+68
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Соедини эти два абзаца, это же один пункт у тебя. Явно напиши, что в Redis пушдаунятся только ключи, а по колонкам пушдаун невозможен. |
||
|
||
3. Поскольку данные в Redis не имеют схемы, нам для отображения их в таблицу приходится выводить ее самостоятельно при каждом запросе. Делается это согласно следующему алгоритму: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Сделай в начале документа нормальный вводный раздел, где опишешь саму концепцию интеграции. Начни с того, что YDB реляционная база, а Redis - NoSQL база, и в этом есть проблема, потому что в табличном виде надо отобразить нетабличные данные. Далее, распиши саму суть нашей идеи - что мы создаём именованные колонки под каждый тип данных. Приведи наглядные примеры, желательно в виде рисунка draw.io или как-то ещё. Очень грубый пример прилагаю: Там же можно сделать подраздел про type inferring. Вот этот п. 3 перенеси туда, но вместо списка представь его в виде отдельного абзаца, где лаконичным литературным языком опиши, зачем нам нужна система вывода типов, и как она функционирует. Не надо выделять ничего жирным. В ограничениях оставь более лаконичную запись, что вывод типов выполняется по первым нескольким пунктам, точное количество указывается в конфиге коннектора. |
||
1. **Сбор ключей** – Выполняется выборка доступных ключей из `Redis` в количестве `N`. | ||
2. **Определение типов данных** – Для выбранных `N` ключей анализируются хранимые значения `string`, `hash`. | ||
3. **Выявление структуры данных** – Если значения представлены в формате `hash` или другой структурированной форме, извлекаются потенциальные колонки. | ||
4. **Формирование схемы** – Определяются типы данных для колонок на основе их значений. | ||
5. **Сохранение схемы** – Полученная схема используется для получения и обработки данных из источника. | ||
|
||
> Если среди `N` `hash` ключей, будет встречено 3 вложенных поля `field1..3`, а при дальнейшем чтении будет встречен `hash` с бОльшим количеством полей, то в результат будут записаны лишь `field1..3`, при их наличии. | ||
|
||
## Поддерживаемые типы данных | ||
[Более подробно про типы Redis можно почитать тут](https://redis.io/glossary/redis-data-structures/) | ||
|
||
Для ключей поддерживается тип `string`, для значений: `string`, `hash` | ||
|
||
Поскольку Redis хранит в себе не традиционные таблицы, а пары `key-value` значений, то данные при чтении трансформируются следующим образом: | ||
|
||
- Все ключи складываются в колонку `key` типа `String` | ||
- Все встреченные значения типа `string` складываются в колонку `string_values` | ||
- Все значения из `hash`, которые присутствуют в схеме, выведенной на этапе сканирования метаданных, заполняются, остальные помечаются `null` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Это официальный документ, здесь всё строго с орфографией и пунктуацией. Везде должны стоять знаки препинания. |
||
|
||
Таким образом, для каждого ключа, который хранит в себе значение типа `string`, ячейка в колонке `string_values` будет заполнена, а в `hash_values` будет равна `null`. Для `hash` аналогично. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. NULL принято писать в CAPS LOCK |
||
|
||
Ниже приведена таблица соответствия типов Redis и {{ ydb-short-name }}. Все остальные типы данных, за исключением перечисленных, не поддерживаются. | ||
|
||
| Тип данных Redis | Тип данных {{ ydb-full-name }} | Примечания | | ||
|------------------|--------------------------------|------------------------------------------------------------| | ||
| `string` | `Optional<String>` | | | ||
| `hash` | `Optional<Struct>` | `StructMembers` внутри `Struct` так же являются `Optional` | |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Поставь плашку с ворнингом

Исходники тут: https://ydb.tech/docs/ru/devops/manual/federated-queries/connector-deployment