Как работает Redis и почему он быстрый
Что проверяют
Понимаете ли вы, что дело не только в памяти, и знаете ли обратную сторону однопоточной модели.
Как отвечать
Redis это хранилище структур данных в оперативной памяти. Не просто ключ-значение: значением может быть строка, список, множество, упорядоченное множество, хеш, поток, битовая карта.
Почему он быстрый, по убыванию вклада:
- данные в памяти: чтение не идёт на диск. Это основная причина, но не единственная;
- однопоточное выполнение команд: все команды исполняет один поток, поэтому нет блокировок, нет переключений контекста и нет гонок. Каждая команда атомарна по построению, и это упрощает и реализацию, и рассуждения о поведении;
- мультиплексирование ввода-вывода: один цикл событий поверх механизмов ядра обслуживает десятки тысяч соединений;
- структуры данных, оптимизированные под размер: маленький хеш или список хранится в компактном представлении, экономящем и память, и обращения к ней;
- простой протокол и конвейеризация: можно отправить сотню команд одним пакетом, не дожидаясь ответов, что убирает влияние задержки сети.
Оговорка про версии: с Redis 6 ввод-вывод может обрабатываться несколькими потоками, но исполнение команд по-прежнему однопоточное.
Обратная сторона, о которой надо сказать обязательно: одна долгая команда блокирует всех. Вызов, перебирающий все ключи, удаление огромного множества, скрипт с циклом, извлечение миллиона элементов списка: на это время сервер не отвечает никому. Отсюда правила: не использовать перебор всех ключей в проде (есть постраничный обход), избегать больших значений, следить за журналом медленных команд.
Про сохранность: снимок состояния делается периодически, журнал команд пишет каждую операцию. Оба варианта компромиссные, и при падении можно потерять последние секунды. Redis это в первую очередь кэш и хранилище оперативных структур, а не замена основной базе.
Где спотыкаются
Объясняют скорость только тем, что данные в памяти.
Не знают, что однопоточность даёт атомарность команд.
Выполняют перебор всех ключей на боевом сервере.
Считают, что данные гарантированно переживут падение.