Подтвердить что ты не робот

Почему 500MB Redis dump.rdb файл занимает около 5,0 ГБ памяти?

На самом деле, у меня есть 3 экземпляра Redis, и я собрал их вместе в этот 500MB + dump.rdb. Сервер Redis может читать этот dump.rdb, и кажется, что все в порядке. Затем я замечаю, что redis-сервер стоит более 5,0 ГБ памяти. Я не знаю почему.

Что-то не так с моим файлом? У моего db есть около 3 миллионов ключей, значения для каждой клавиши - это список, содержащий около 80 целых чисел.

Я использую этот МЕТОД, чтобы собрать 3 экземпляра вместе.

PS: Еще один dump.rdb с одинаковым размером и той же структурой ключевого значения стоит только 1 ГБ памяти.

И мои данные выглядят как keyNum → {num1, num2, num3,......}. Все номера составляют от 1 до 4 000 000. Так что я должен использовать List для их хранения? На данный момент я использую lpush (k, v). Это слишком дорого стоило?

4b9b3361

Ответ 1

Отношение памяти к размеру дампа зависит от типов данных, которые Redis использует внутренне.

Для небольших объектов (хэшей, списков и сортировщиков) redis использует ziplists для кодирования данных. Для небольших наборов, состоящих из целых чисел, redis использует Intsets. ZipLists и IntSets хранятся на диске в том же формате, который хранится в памяти. Таким образом, вы ожидаете соотношение 1:1, если ваши данные используют эти кодировки.

Для больших объектов представление в памяти полностью отличается от представления на диске. Формат на диске сжат, не имеет указателей, не имеет дело с фрагментацией памяти. Таким образом, если ваши объекты велики, соотношение между памятью и диском 10: 1 является нормальным и ожидается.

Если вы хотите узнать, какие объекты съедают память, используйте redis-rdb-tools для профилирования ваших данных. Оттуда следуйте заметкам оптимизации памяти на redis.io, а также wiki для оптимизации памяти на инструментах redis-rdb.

Ответ 2

Там может быть больше, но я считаю, что Redis сжимает файлы дампа.