Избегайте ограничения на значения в Memcache "1000000 байт" - PullRequest
19 голосов
/ 03 февраля 2012

В моей модели есть разные сущности, которые я бы хотел вычислить один раз, как сотрудников компании.Чтобы не делать один и тот же запрос снова и снова, вычисленный список сохраняется в Memcache (duration = 1day). Проблема в том, что приложение иногда выдает ошибку, что в Memcache хранится больше байтов, чем допустимо:

Values may not be more than 1000000 bytes in length; received 1071339 bytes

Хранение списка объектов - это то, что вы должны делать с Memcache?Если это так, каковы наилучшие методы, чтобы избежать ошибки, описанной выше?Я сейчас тяну 1000 предметов.Вы ограничиваете значения до <200?Проверка размера объекта в памяти не кажется слишком хорошей идеей, потому что они, вероятно, обрабатываются (сериализуются или что-то в этом роде) перед входом в Memcache. </p>

Ответы [ 4 ]

29 голосов
/ 04 февраля 2012

Дэвид, вы не говорите, какой язык вы используете, но в Python вы можете сделать то же самое, что Ибрагим предлагает использовать pickle.Все, что вам нужно сделать, это написать две маленькие вспомогательные функции, которые читают и записывают большой объект в memcache.Вот (непроверенный) эскиз:

def store(key, value, chunksize=950000):
  serialized = pickle.dumps(value, 2)
  values = {}
  for i in xrange(0, len(serialized), chunksize):
    values['%s.%s' % (key, i//chunksize)] = serialized[i : i+chunksize]
  return memcache.set_multi(values)

def retrieve(key):
  result = memcache.get_multi(['%s.%s' % (key, i) for i in xrange(32)])
  serialized = ''.join([v for k, v in sorted(result.items()) if v is not None])
  return pickle.loads(serialized)
9 голосов
/ 03 февраля 2012

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

Поскольку я использую Java, чтоЯ выполнил сериализацию моих необработанных объектов с использованием сериализатора Java, создав сериализованный массив байтов.Поскольку размер сериализованного объекта теперь известен, я мог бы разрезать на куски массивы байтов по 800 КБ.Затем я инкапсулирую байтовый массив в объект-контейнер и сохраняю этот объект вместо необработанных объектов.

Каждый объект-контейнер может иметь указатель на следующий ключ memcache, где я могу получить следующий фрагмент массива байтов, илиnull, если больше нет кусков, которые нужно извлечь из memcache.(т. е. точно так же, как связанный список), затем я заново объединяю куски байтовых массивов в большой байтовый массив и десериализую его с помощью десериализатора Java.

5 голосов
/ 03 февраля 2012

Всегда ли вам нужен доступ ко всем данным, которые вы храните?Если нет, то вам будет полезно разделить набор данных и получить доступ только к той части данных, которая вам нужна.

Если вы отобразите список из 1000 сотрудников, вы, вероятно, будете разбивать его на страницы.Если вы разбиваете на страницы, то вы определенно можете разбить их на части.

Вы можете составить два списка своего набора данных: один легче с самой важной информацией, которая может уместиться в 1 МБ, и другой список, который разделен на несколько частей с полной информацией,В легком списке вы сможете применить самые важные операции, например, фильтрацию по имени или нумерации сотрудников.А затем при необходимости загрузите тяжелый набор данных, вы сможете загружать только те части, которые вам действительно нужны.

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

3 голосов
/ 30 марта 2015

Если вы знаете, насколько большими будут объекты, вы можете использовать опцию memcached, чтобы разрешить объекты большего размера:

memcached -I 10m

Это позволит объектам размером до 10 МБ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...