На главную
DevOps и серверы
Память Redis
Сколько памяти займут ваши ключи в Redis — с учётом кодировок listpack и hashtable, размер-классов аллокатора, TTL, фрагментации и запаса на fork при сохранении. На выходе — maxmemory, политика вытеснения и объём RAM под сервер.
session:<id>
Кодировка raw, 768 Б на ключ, всего 732 МБ.
Сервер
mem_fragmentation_ratio из INFO memory; 1,2 — обычно
repl-backlog-size; 0 — без реплик
Итог
748 МБ
данные в памяти
827 МБ
maxmemory
996 МБ
RSS с фрагментацией
1,2 ГБ
RAM под сервер
maxmemory-policy allkeys-lfu — Кэш: при нехватке памяти вытесняются редко используемые ключи. LFU лучше LRU, когда есть «горячие» ключи и разовые проходы по всем данным.
redis.conf
maxmemory 827mb maxmemory-policy allkeys-lfu maxmemory-samples 10 save "" appendonly no activedefrag yes
Как считается
- Каждый ключ — запись в главном словаре (24 байта → класс 32), SDS-строка имени и объект значения. Ключ с TTL — ещё запись в словаре expires.
- jemalloc выдаёт память размер-классами: 8, 16, 32, 48 … 128, 160, 192 … — строка в 45 байт стоит 64.
- Маленькие hash, set и zset хранятся в listpack, пока полей не больше 128 и каждое короче 64 байт (hash-max-listpack-*). Одно длинное значение переводит весь ключ в hashtable.
- Словари растут степенями двойки: 1,1 млн ключей — это таблица на 2 млн корзин по 8 байт.
- Проверить на живом Redis: MEMORY USAGE ключ и INFO memory. Модель даёт порядок, а не байт в байт — версия и настройки сдвигают её на 10–20 %.