Что такое Redis и его особенности
Что проверяют
Понимаете ли вы Redis как инструмент с конкретными гарантиями, а не как «быстрый кеш». Для .NET следом почти всегда спрашивают, как вы подключаете его в ASP.NET Core и что будет с данными при падении сервера.
Как отвечать
Redis это хранилище «ключ-значение» в оперативной памяти. Команды выполняются в одном потоке, поэтому каждая отдельная команда атомарна, а время ответа на сервере обычно меньше миллисекунды, основную задержку даёт сеть. Ключевые особенности:
- структуры данных: строки, хэши, списки, множества, sorted sets для рейтингов, streams, HyperLogLog, геоиндексы. В Redis 8 в ядро вошли JSON и векторный поиск, которые раньше жили в модулях;
- TTL и вытеснение:
EXPIREна ключ плюсmaxmemory-policy. По умолчанию стоитnoeviction, и при заполнении памяти запись просто падает с ошибкой, для кеша обычно ставятallkeys-lru; - персистентность: снимки RDB и журнал AOF, при
appendfsync everysecможно потерять около секунды записей; - отказоустойчивость: асинхронная репликация, Sentinel для переключения мастера, Redis Cluster с шардированием по 16384 слотам;
- Pub/Sub и Streams: Pub/Sub не хранит сообщения, отключённый подписчик их теряет. Для надёжной доставки нужны Streams с группами потребителей.
В .NET стандартный клиент StackExchange.Redis. В ASP.NET Core Redis подключают как IDistributedCache через AddStackExchangeRedisCache, пакет Microsoft.Extensions.Caching.Hybrid даёт HybridCache с локальным уровнем и защитой от одновременного пересчёта, а ещё Redis служит бэкплейном для SignalR и хранилищем ключей Data Protection.
Упомяните лицензию: с 2024 года Redis не под BSD, поэтому появился форк Valkey, и облака часто предлагают именно его.
Где спотыкаются
Создают ConnectionMultiplexer на каждый запрос. Он потокобезопасен и рассчитан на один экземпляр на приложение, регистрируется синглтоном, а GetDatabase() дёшев и вызывается где угодно.
Ловят RedisTimeoutException и винят Redis, хотя причина в голодании пула потоков из-за .Result и .Wait() поверх асинхронных методов.
Вызывают KEYS * на проде. Команда блокирует сервер на всё время обхода, вместо неё нужен SCAN.