Где в Redis сохраняются данные
Что проверяют
Понимаете ли вы, что Redis держит данные в оперативной памяти, а диск нужен только для восстановления после перезапуска. Следом обычно спрашивают, сколько данных можно потерять при падении и как это настраивается.
Как отвечать
Весь набор данных Redis лежит в RAM, отсюда и скорость. На диск он пишет копию, и способов два:
- RDB: периодический снимок в бинарный файл
dump.rdb. Частоту задают правилаsaveвида «раз в N секунд, если изменилось M ключей». Снимок делает дочерний процесс черезfork(BGSAVE), основной поток продолжает работать. Файл компактный и быстро загружается, но всё, что изменилось после последнего снимка, при падении пропадёт; - AOF: журнал изменяющих команд, включается
appendonly yes. Как часто журнал сбрасывается на диск, решаетappendfsync:always(надёжно и медленно),everysec(по умолчанию, теряется примерно секунда),no(решает ОС). Журнал периодически переписывается в сжатый вид (BGREWRITEAOF), в современных версиях это набор файлов в каталогеappendonlydir, а базовая часть хранится в формате RDB; - без персистентности: для чистого кэша оба механизма отключают, и после рестарта Redis стартует пустым.
Где физически лежат файлы, задаёт параметр dir в redis.conf. В официальном Docker-образе это /data, и без тома данные умрут вместе с контейнером.
Для .NET добавьте, что клиент ничего не хранит: StackExchange.Redis через ConnectionMultiplexer или IDistributedCache из Microsoft.Extensions.Caching.StackExchangeRedis только отправляют команды на сервер. Если Redis у вас кэш, приложение должно переживать его пустой старт; если это основное хранилище, нужны AOF и реплика.
Где спотыкаются
Говорят «Redis хранит данные на диске, как база». Диск это запасная копия, читает Redis всегда из памяти, и объём ограничен RAM и maxmemory.
Считают, что AOF гарантирует нулевую потерю. При everysec можно потерять последнюю секунду записи, а always сильно режет производительность.
Забывают про цену fork: на большом наборе данных снимок при активной записи заметно раздувает потребление памяти из-за copy-on-write.