2012-05-24 2 views
4

Я хочу загрузить данные с 4 столбцами и 80 миллионными строками в MySQL на Redis, так что я могу уменьшить задержку забора.redis memory efficiency

Однако, когда я пытаюсь загрузить все данные, он будет в 5 раз больше.

Исходные данные были 3gb (при экспорте в формат csv), но когда я загружаю их на Redis, он занимает 15 ГБ ... он слишком велик для нашей системы.

Я также пробовал различные типы данных -

1) 'table_name: row_number: column_name' -> струнные 2) 'table_name: row_number' -> хэш

, но все из них занимает слишком много.

Я что-то упустил?

добавлено)

мои данные имеют 4 столбец - (идентификатор пользователя (рк), граф, созданный время и дата)

+1

Не могли бы вы немного объяснить данные, которые вы пытаетесь моделировать, и шаблоны доступа? –

+0

Ну, вы сравниваете плоские данные с индексированными данными в памяти ... конечно, это намного больше. Используйте хэш для представления ваших строк, минимизации длины ключа и добавления индексов только на том материале, который вам действительно нужно индексировать. –

ответ

8

Наиболее памяти эффективным способом является хранение значений в виде массива JSON, и разделяя ваши ключи таким образом, чтобы их можно было хранить с помощью хеширования с кодировкой ziplist.

  1. Кодируйте свои данные, используя say json array, поэтому у вас есть пары ключей = значение, например user:1234567 -> [21,'25-05-2012','14-06-2010'].
  2. Разделите свои ключи на две части, чтобы вторая часть имела около 100 возможностей. Например, user:12345 и 67
  3. магазин этот комбинированный ключ в хэш, как этот hset user:12345 67 <json>
  4. Чтобы получить сведения о пользователе для идентификатора пользователя 9876523, просто hget user:98765 23 и анализировать массив JSon
  5. Убедитесь, что настройки параметров hash-max-ziplist-entries and hash-max-ziplist-value

Instagram wrote a great blog post explaining this technique, поэтому я пропущу объяснение, почему это эффективная память.

Вместо этого я могу сказать вам о недостатках этой техники.

  1. У вас нет доступа или обновления одного атрибута для пользователя; вы должны переписать всю запись.
  2. Вам нужно было бы получить весь объект json всегда, даже если вам нравятся только некоторые поля.
  3. Наконец, вы должны написать эту логику о ключах расщепления, в которые добавлено техническое обслуживание.

Как всегда, это компромисс. Определите свои шаблоны доступа и посмотрите, имеет ли смысл такая структура. Если нет, вам придется покупать больше памяти.

+0

Ничего себе, это больше, чем я ожидал. Благодаря! –