Skip to content

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

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 97 additions & 0 deletions ydb/docs/ru/core/concepts/federated_query/redis.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# Работа с базами данных Redis
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Поставь плашку с ворнингом
image

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


В этом разделе описана основная информация про работу с внешней `NoSQL` базой данных [Redis](https://redis.io/), которая представляет собой `in-memory` `key-value` хранилище.
Copy link
Member

Choose a reason for hiding this comment

The 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"`.
Copy link
Member

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/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",
Copy link
Member

Choose a reason for hiding this comment

The 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 ключи:
Copy link
Member

Choose a reason for hiding this comment

The 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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сделай примеры с реальными почтовыми адресами

```

то вы можете получить все ключи `sample_session` следующим образом:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ключи с префиксом sample_session, наверное?


```yql
SELECT * FROM redis_datasource.`sample_session:*`
Copy link
Member

Choose a reason for hiding this comment

The 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 }}.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В нумерованных списках все пункты начинаются с единицы - такой синтаксис


В случае с Redis производится пушдаун фильтрации по `<key_prefix>`, описанной выше.
Comment on lines +66 to +68
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Соедини эти два абзаца, это же один пункт у тебя. Явно напиши, что в Redis пушдаунятся только ключи, а по колонкам пушдаун невозможен.


3. Поскольку данные в Redis не имеют схемы, нам для отображения их в таблицу приходится выводить ее самостоятельно при каждом запросе. Делается это согласно следующему алгоритму:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сделай в начале документа нормальный вводный раздел, где опишешь саму концепцию интеграции. Начни с того, что YDB реляционная база, а Redis - NoSQL база, и в этом есть проблема, потому что в табличном виде надо отобразить нетабличные данные. Далее, распиши саму суть нашей идеи - что мы создаём именованные колонки под каждый тип данных. Приведи наглядные примеры, желательно в виде рисунка draw.io или как-то ещё. Очень грубый пример прилагаю:
image

Там же можно сделать подраздел про 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`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это официальный документ, здесь всё строго с орфографией и пунктуацией. Везде должны стоять знаки препинания.


Таким образом, для каждого ключа, который хранит в себе значение типа `string`, ячейка в колонке `string_values` будет заполнена, а в `hash_values` будет равна `null`. Для `hash` аналогично.
Copy link
Member

Choose a reason for hiding this comment

The 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` |
Loading