Что происходит при превышении объема данных Redis объема оперативной памяти
Что проверяют
Понимаете ли вы, что Redis это память, а не бездонное хранилище, и что кэш обязан уметь отдать промах. Для бэкенда на .NET вопрос практический: как поведёт себя сервис, когда на запись в кэш начнут приходить ошибки.
Как отвечать
Всё решает пара настроек сервера:
maxmemory: верхняя граница. Если она не задана, Redis растёт, пока процесс не прибьёт механизм нехватки памяти в системе, а до этого машина уйдёт в своп и задержки вырастут на порядки;maxmemory-policy: что делать при достижении границы. По умолчаниюnoeviction: чтения работают, а любая команда записи возвращает ошибку про нехватку памяти.
Остальные политики делятся на два семейства: allkeys-* выбирают жертву среди всех ключей, volatile-* только среди ключей с выставленным TTL, и если таких нет, ведут себя как noeviction. Внутри семейства: lru (давно не обращались), lfu (обращаются редко), random, а для volatile ещё ttl (ближайший к истечению). Важная деталь: lru и lfu приближённые, Redis не держит полный порядок, а выбирает лучшего кандидата из случайной выборки.
Считать занятое место по сумме значений нельзя: сверху идут накладные расходы структур, фрагментация аллокатора, буферы клиентов и репликации, поэтому used_memory и used_memory_rss расходятся.
Со стороны приложения клиент получает ошибку сервера на запись, а чтение просто не находит ключ. Значит, путь «не нашли в кэше, посчитали заново» должен работать всегда, а неудачная запись в кэш не должна ронять пользовательский запрос.
Где спотыкаются
Ничего не настраивают и надеются, что Redis сам разберётся. Без maxmemory дело кончается убийством процесса и потерей всего кэша разом, причём в самый нагруженный момент.
Относятся к Redis как к базе и держат там единственную копию данных. При вытеснении ключ исчезает молча, без единой ошибки в логе, и восстановить его неоткуда.
Путают вытеснение и истечение срока. TTL удаляет по времени, вытеснение по нехватке памяти. Ключи без TTL при политике volatile-lru не вытесняются вовсе: память упирается в потолок, и записи начинают падать.