liner_broker 1.3.3

Redis based message serverless broker.
Documentation
# Использование liner с Redis

Руководство для интеграторов с **Redis** как общим хранилищем: сборка по умолчанию, создание клиентов, **один URL** для всех процессов и Python-интеграционные тесты.

**См. также:** [backends.md](backends.md), [routing-and-store-layout.md](routing-and-store-layout.md) (ключи Redis), [operations-redis-sqlite.md](operations-redis-sqlite.md), [errors-and-logging.md](errors-and-logging.md), [bindings.md](bindings.md).

---

## Когда подходит Redis

- **Общий каталог** — все процессы используют **один URL Redis** (как **PostgreSQL**; не как отдельные файлы SQLite).
- **Низкая задержка**, преимущественно in-memory — удобный вариант по умолчанию.
- **Тот же API обмена**, что у других бэкендов: `run`, `send_to`, `subscribe`, TCP.

**Не подходит**, если нужен **один переносимый файл без сервера** — **SQLite**. Для **SQL и таблиц** — **PostgreSQL** ([using-postgres.md](using-postgres.md)).

У Redis-клиентов **нет `receivers_json`**. Пиры видят друг друга после **`run`**; **внутренний канал** синхронизирует кэш адресов в рантайме (см. [using-the-api.md](using-the-api.md)).

---

## Сборка

Redis входит в **сборку по умолчанию**, без дополнительной фичи:

```bash
cargo build --release
```

Крейт **`redis`**: **`Client::open`**, затем **`get_connection`** при создании store.

**C / Python:** в стандартной **`libliner_broker.so`** уже есть **`lnr_new_client_redis`**.

---

## URL подключения

Например:

```text
redis://127.0.0.1/
redis://127.0.0.1:6379/3
```

Выделите **отдельную логическую БД** (`/N` в URL), чтобы ключи **`lnr_*`** не смешивались с другими приложениями — [operations-redis-sqlite.md](operations-redis-sqlite.md).

Непустые **`unique_name`**, **`topic`**, **`localhost`**. Если Redis недоступен — **`None`** / C **`NULL`**.

**Версия сервера:** рекомендуется Redis **≥ 6.2**.

---

## Общее хранилище

| Вопрос | Поведение |
|--------|-----------|
| **Каталог** | Хеш **`lnr_topic:{topic}:addr`** общий для всех клиентов с одним URL. |
| **Старт сети** | A **`run`** → B **`run`****`send_to`**. Кэш адресов обновляется по внутреннему каналу; **`refresh_address_topic`** по желанию — см. [using-the-api.md]using-the-api.md. |
| **`at_least_once_delivery`** | На **одном URL** ack в **`lnr_connection:{id}:mess_number`** виден отправителю. |
| **Несколько пиров** | Fan-out / fan-in на **одном URL** без JSON (см. изолированный SQLite в [using-sqlite.md]using-sqlite.md). |

Подробнее о ключах: [routing-and-store-layout.md](routing-and-store-layout.md).

---

## Создание клиента

### Rust

```rust
let mut c = Client::new_redis(
    "my_unique_name",
    "my_source_topic",
    "127.0.0.1:0",
    "redis://127.0.0.1/",
)
.expect("open redis store");
```

**`Client::new`** — псевдоним для **`new_redis`**.

### C (`include/liner.h`)

```c
lnr_hClient c = lnr_new_client_redis(
    "my_unique_name", "my_source_topic", "127.0.0.1:0", "redis://127.0.0.1/");
```

**`lnr_new_client`** (устаревший) вызывает **`lnr_new_client_redis`**.

### Python (`python/liner.py`)

```python
liner.loadLib("target/release/libliner_broker.so")
c = liner.Client("my_unique_name", "my_source_topic", "127.0.0.1:0", "redis://127.0.0.1/")
```

После **`run`** — **`bound_listen_addr()`**, **`unique_name()`**.

---

## Проверка в Redis

```bash
redis-cli HGETALL lnr_topic:my_topic:addr
redis-cli GET lnr_topic:my_topic:key
```

В проде — **`SCAN`** с шаблоном `lnr_*`, не **`KEYS`**.

---

## Два пира (кратко)

1. Запустить Redis, один URL для всех.
2. `cargo build --release`.
3. A: `new_redis`, `run` на `topic_a`.
4. B: тот же URL, `run` на `topic_b`.
5. B: `refresh_address_topic("topic_a")`, `send_to(...)`.

Бенч: **`bench_pair_sendto_redis`**.

---

## Тесты

```bash
cargo build --release
python3 test/redis/run_integration.py
```

Часто поднимают Redis в **Docker** на порту **16379**. См. [debug-and-tests.md](debug-and-tests.md).

---

## См. также

- [using-sqlite.md]using-sqlite.md, [using-postgres.md]using-postgres.md  
- [offline-delivery-and-message-numbers.md]offline-delivery-and-message-numbers.md