2017-01-22 6 views
0

Мы используем узел Elasticache Redis для хранения данных.Как пары ключ/значение хранятся в Redis

Все ключи имеют одинаковый формат:
- Ключ - хеш-память md5 - 128 бит (16 байт, 32 строковых символа байтов).
- Значение строки времени - 19 байт.
В целом, размер ключа 32+19=51 bytes

Мы 84 917 361 миллионов ключей.
Я предполагаю, общая память, что оболочка Redis потребляет, близко к 84917361*51 = 4.03 gb.

Собственно, требуется 11.07 gb.
Выход info команды: used_memory_human:11.07G

  1. На что расходуется остальная часть памяти, 7 gb?
  2. Есть ли способ хранить md5 как хэш 16 байтов, а не строку с 32 символами?

Спасибо, любая помощь очень ценится.

+0

Возможно, вас заинтересует [эта статья] (https://redis.io/topics/memory-optimization), особенно часть о влиянии клавиш на клавиши на хеши. –

+0

Спасибо @ Кевин Кристофер Генри, я буду реализовывать предложения. – antonbormotov

ответ

1

В чем проводится остаток памяти, 7 ГБ?

Короткий ответ: Redis НЕ ключ и значение в качестве сырья строки хранения.

В самом деле,

  1. ключа завернутый в sdshdr структуру (для последней версии, это более компактная структура), которая имеет некоторые накладные расходы, например, длина строки.

  2. значение обернуто в структуру redisObject, которая также имеет некоторые накладные расходы, например. кодирование объектов, refcount.

  3. Есть и другие накладные расходы, когда Redis вставляет пару в dict, например. указатель next и key указатель в dictEntry структура.

Все эти накладные расходы потребляют остальную память.

Для того, чтобы сделать его более эффективной память, вы можете обратиться к статье, которая упоминается @Kevin Кристофер Генри (маленький хэш может сэкономить много redisObject накладных расходов, и может использовать ziplist сделать элементы более компактно в памяти).

Есть ли способ сохранить md5 как 16-байтовый хеш, а не строку с 32 символами?

Используйте хэш-функции, такие как Murmurhash, чтобы создать дайджест для каждой строки md5.

Таким образом вы можете получить дайджест объемом 8 байт (64 бит). Однако вы не можете получить необработанную строку md5 из дайджест Murmurhash. Поэтому, если вы делаете NOT, обратите внимание на значение md5, вы можете воспользоваться этим методом.

+0

Спасибо @for_stack, вот что я искал. Я попытаюсь использовать 'Murmurhash' или' crc32' как значение хэш-функции. – antonbormotov

Смежные вопросы