Redis: Показать размер базы данных / размер ключей

88

Мой экземпляр redis, кажется, становится очень большим, и я хотел бы узнать, какая из нескольких баз данных, которые у меня есть, потребляет сколько памяти. INFOКоманда Redis просто показывает мне общий размер и количество ключей для каждой базы данных, что не дает мне особого представления ... Так что любые инструменты / идеи, которые дают мне больше информации при мониторинге сервера Redis, будут оценены.

Документация Redis не показывает мне никаких команд, которые могут вернуть потребленную память определенных ключей, поэтому я предполагаю, что если какой-либо ошибочный код будет записывать много "мусора" в redis, это будет действительно сложно найти ...

Бернхард Валлант
источник

Ответы:

113

Итак, мое решение моей собственной проблемы: поиграв redis-cliнемного дольше, я обнаружил, что DEBUG OBJECT <key>обнаруживается что-то вроде serializedlengthключа, который на самом деле был тем, что я искал ...

Для всей базы данных вам необходимо агрегировать все значения, для KEYS *чего не должно быть слишком сложно с языком сценариев по вашему выбору ...

Плохо то, что у redis.io действительно мало информации DEBUG OBJECT.

Бернхард Валлант
источник
1
Является ли сериализованная длина размером всего объекта в байтах?
raffian
18
@BernhardVallant, спасибо за ответ. Я пошел дальше и написал быстрый сценарий, который печатает все ключи и их размеры в удобочитаемом формате. Думал, что поделюсь. :) gist.github.com/epicserve/5699837
Брент О'Коннор,
13
Значение serializedlength не связано с размером памяти! Это размер, который будут иметь объекты при сохранении в файл RDB на диске. Проверьте исходный код: github.com/antirez/redis/blob/… и github.com/antirez/redis/blob/…
Hugo Tavares
похоже, нет способа получить размер ключа, или значения, или ключевого значения в памяти (не размер выгружаемого на диск)
Avner Barr
4
К вашему сведению: не пытайтесь ничего делать с DEBUG на AWS ElastiCache Redis, docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/… . Даже найденный redis-cli --bigkeys будет останавливаться
sonjz
70

Решение из комментариев заслуживает собственного ответа:

redis-cli --bigkeys
miracle2k
источник
1
big keys - это размер ключа , а не размер сохраненного значения ... так что у вас может быть ключ aсо значением 4 ГБ, но это не будет отображаться в bigkeys. (это делается gist.github.com/michael-grunder/9257326 и docs.redislabs.com/latest/ri/memory-optimizations/… )
EoghanM
40

MEMORY USAGE key Команда дает вам количество байтов, которое требуется для хранения ключа и его значения в ОЗУ.

Сообщаемое использование - это общее выделение памяти для данных и административных накладных расходов, которые требуются для ключа, соответствующего его значению (исходная документация Redis)

морская собака
источник
11
может использоваться только версия> 4.0
teik
15

Взгляните на этот проект, он выводит интересную статистику о пространствах ключей на основе регулярных выражений и префиксов. Он использует DEBUG OBJECTкоманду и сканирует базу данных, идентифицируя группы ключей и оценивая процент пространства, которое они занимают.

https://github.com/snmaynard/redis-audit

Результат выглядит так:

Summary  

---------------------------------------------------+--------------+-------------------+---------------------------------------------------  
Key                                                | Memory Usage | Expiry Proportion | Last Access Time                                    
---------------------------------------------------+--------------+-------------------+---------------------------------------------------  
notification_3109439                               | 88.14%       | 0.0%              | 2 minutes                               
user_profile_3897016                               | 11.86%       | 99.98%            | 20 seconds  
---------------------------------------------------+--------------+-------------------+---------------------------------------------------  

Или вот этот: https://github.com/sripathikrishnan/redis-rdb-tools, который выполняет полный анализ всего пространства ключей, анализируя файл dump.rdb в автономном режиме. Этот тоже хорошо работает. Он может дать вам средний / минимальный / максимальный размер для записей в вашей базе данных и даже сделает это на основе префикса.

Jumand
источник
8

Возможно, вам будет очень полезно взять образцы ключей Redis и сгруппировать их по типу. Сальваторе написал инструмент под названием redis-sampler, который выдает около 10000 RANDOMKEYкоманд, за которыми следуют TYPEизвлеченные ключи. За секунды или минуты вы должны получить довольно точное представление о распределении типов ключей.

Я написал расширение (к сожалению, нигде с открытым исходным кодом, потому что оно связано с работой), которое добавляет немного самоанализа имен ключей с помощью регулярных выражений, которые дают вам представление о том, какие типы ключей приложения (в зависимости от структуры именования вы using), хранятся в Redis. В сочетании с более общим выводом redis-sampler это должно дать вам очень хорошее представление о том, что происходит.

рлотун
источник
7
Спасибо, на самом деле помог мне больше, чемredis-cli --bigkeys
nmat
4

Возможно, вам удастся провести некоторый анализ файла db. Протокол относительно прост (но плохо документирован), поэтому вы можете написать для него парсер, чтобы определить, какие отдельные ключи занимают много места.


Новые предложения:

Вы пробовали использовать, MONITORчтобы посмотреть, что пишется вживую? Возможно, вы найдете проблему с данными в движении.

Дональд Майнер
источник
Кажется интересным, но, тем не менее, я пытаюсь найти простой способ контролировать потребление памяти Redis на сервере ... Изучение дампа кажется мне более практичным для отладки, не говоря уже о том, что дамп - это несколько концерты сейчас!
Бернхард Валлант 03
Вам следует спросить список рассылки Redis. Мне действительно интересно услышать «лучший» ответ на этот вопрос.
Дональд Майнер,
Ну, уже попробовали, INFOи MONITOR, возможно, главная проблема в том, что, когда я не смотрел, Redis действительно вырос ...
Бернхард Валлант
Хорошо, я отправил это в их список рассылки, но нашел ответ и сам ... См. Ниже!
Бернхард Валлант
ре. интроспекция файла db - я написал сценарий для анализа файлов dump.rdb и вывода файла csv, сообщающего приблизительную память, используемую каждым ключом. См github.com/sripathikrishnan/redis-rdb-tools
Sripathi Кришнан
2

Вы можете использовать приложение .net https://github.com/abhiyx/RedisSizeCalculator для расчета размера ключа redis,

Пожалуйста, не стесняйтесь оставлять свои отзывы о том же

абхи
источник
1

Я обычно предпочитаю ключевой метод выборки для устранения таких сценариев.

redis-cli -p 6379 -n номер_базы --bigkeys

Например:-

redis-cli -p 6370 -n 0 --bigkeys

Anrajme
источник
Почему это метод «ключевой выборки»? Я считаю его очень ограниченным, поскольку он показывает только верхушку айсберга.
MrR
0

Как насчет redis-cli получить KEYNAME | туалет -c

Эд Гринберг
источник