Как посмотреть, сколько памяти занимает ключ в Redis
Что проверяют
Знаете ли вы штатный инструмент и понимаете ли, от чего зависит размер ключа: кодировка структуры, накладные расходы, сериализация на стороне приложения. Следом обычно просят найти самые тяжёлые ключи на проде, ничего не положив.
Как отвечать
MEMORY USAGE key: сколько байт занимает ключ вместе со значением и служебными структурами, команда есть с Redis 4.0. Для несуществующего ключа вернётсяnil, а не ноль;SAMPLES: для хешей, списков и множеств Redis по умолчанию оценивает размер по пяти элементам и экстраполирует.MEMORY USAGE key SAMPLES 0пройдёт по всем элементам: точнее, но дольше на больших коллекциях;OBJECT ENCODING key: во что упакована структура. Маленькие хеши и списки хранятся в компактномlistpack, а при превышении порогов (hash-max-listpack-entriesи родственные настройки) переходят вhashtableилиquicklist, и память на элемент резко растёт;INFO memoryиMEMORY STATS: картина по инстансу,used_memory,used_memory_rssиmem_fragmentation_ratio;redis-cli --bigkeysи--memkeys: обход черезSCANв поиске крупных ключей, безопасен для прода.
Из Java команда доступна напрямую: у Jedis и у Lettuce есть метод memoryUsage(key). Но главная часть ответа для Java-разработчика про сериализацию. RedisTemplate в Spring Data Redis по умолчанию использует JdkSerializationRedisSerializer: ключи получают бинарный префикс, а значения раздуваются служебными данными Java-сериализации. Обычно ключи переводят на StringRedisSerializer, значения на JSON или компактный бинарный формат. Учтите, что JSON-сериализатор с информацией о типе добавляет в каждое значение имя класса.
Где спотыкаются
Ищут большие ключи через KEYS *. Команда блокирует однопоточный Redis на время обхода всей базы, на проде это авария.
Считают размером STRLEN или serializedlength из DEBUG OBJECT. Это длина данных, а не занятая память, к тому же DEBUG в управляемых сервисах обычно отключён.
Не учитывают фрагментацию: удалили половину ключей, а RSS процесса не уменьшился. Ответ в mem_fragmentation_ratio и в настройке activedefrag.