1. Наименование системы

"MiniStore" — многопоточный in-memory key-value сервер с текстовым протоколом.

2. Предметная область

Системы кэширования и хранения данных типа "ключ-значение" (как Redis/Memcached) широко используются для ускорения доступа к часто запрашиваемым данным в высоконагруженных приложениях (веб-сайты, API, сессии пользователей). Задача — разработать упрощённый аналог, демонстрирующий базовые принципы работы таких систем: конкурентный доступ к данным, обработка множества сетевых подключений, простая коммуникация по протоколу.

3. Постановка задачи

Разработать сервер, который:

принимает TCP-подключения от произвольного числа клиентов одновременно;
хранит данные в оперативной памяти в виде пар "ключ-значение";
поддерживает базовый набор команд (SET, GET, DEL, возможно EXISTS, KEYS);
корректно обрабатывает конкурентный доступ к данным без потери целостности;
выдерживает нагрузочное тестирование с измерением производительности (запросов/сек, задержка).
4. Функциональные требования

FR1: Клиент подключается по TCP и отправляет текстовые команды
FR2: SET key value — сохранить пару
FR3: GET key — вернуть значение или "не найдено"
FR4: DEL key — удалить пару
FR5: Поддержка множества одновременных клиентских подключений
FR6 (опционально): TTL (время жизни ключа), персистентность на диск
5. Нефункциональные требования

NFR1: Сервер должен выдерживать не менее N одновременных подключений (например, 1000+) — конкретное число уточняется на этапе тестирования
NFR2: Среднее время ответа на запрос — не более X мс под нагрузкой
NFR3: Отсутствие гонок данных (data race) при конкурентном доступе
NFR4: Устойчивость к некорректным командам (не должен падать)
6. Технологический стек

Язык: Rust
Асинхронный рантайм / сеть: tokio (обработка TCP-соединений)
Хранилище: in-memory, HashMap внутри Arc<Mutex<>> или DashMap (конкурентная хэш-таблица) — обсудим на этапе архитектуры
База данных: не требуется (хранение только в памяти); опционально — простая сериализация на диск (serde + JSON/бинарный формат) для персистентности
Тестирование нагрузки: собственный скрипт-клиент на Rust, либо готовый инструмент (redis-benchmark-подобный самописный, либо wrk/hey если сервер получит HTTP-обвязку)
7. Результат (deliverables)

Исходный код сервера
Простой клиент для ручной проверки (или инструкция по подключению через netcat/telnet)
Скрипт нагрузочного тестирования
Отчёт с замерами производительности (RPS, latency при разном числе потоков/подключений)