На главную

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 %.