Memcached для приложения для социальных сетей - PullRequest
2 голосов
/ 01 августа 2010

Я задавал этот вопрос в ASP.NET ...

http://forums.asp.net/t/1584731.aspx

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

Короткая история, я создаю веб-приложение с социальными функциями, используя memcached в качестве слоя кэширования для базы данных.Чтобы упростить проблему, давайте предположим базовую настройку, где у нас есть таблица лиц и таблица friendConnection, где люди содержат личную информацию, а friendConnection имеет два внешних ключа, связывающих одного человека с другим, если они подружились друг с другом (я на самом деле не являюсьиспользуя таблицы или SQL, но проблема аналогична)

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

Более сложная логика, скажем, может истечь все операторы select, содержащие текущиессылаться на друга, но для этого потребуется получить ВСЕ операторы выбора, относящиеся к таблице friendConnection, и проверить их на релевантность, что также приведет к снижению производительности.

Во-первых, имеет ли смысл мой вопрос?

Во-вторых, как люди обычно решают эту проблему?

1 Ответ

1 голос
/ 01 августа 2010

Не связывайте записи memcached с таблицами, связывайте записи с сущностями (то есть строками).

Например, создайте запись memcached для каждого участника, и запись хранит список друзей этого члена.

Вот пример с PHP.Я знаю, что вы используете ASP.NET, так что рассматривайте это как псевдокод.: -)

<?php
$m = new Memcached();
$m->append('Luke.Doolittle', '|Bill Karwin');
$m->append('Bill Karwin', '|Luke.Doolittle');

Re ваши комментарии:

Проблема, которую я вижу, состоит в том, что не существует обобщенного шаблона для размещения объектов в memcached тогда.

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

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

Логика будет разной для каждого типа объекта.Имеет ли это смысл?

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

Как вы выполняете удаление, используя эту технику?

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

Мой пример выше был довольно прост;он также не обеспечивает уникальности.

Возможно, вам будет интересно проверить Redis , который работает как memcached, но также поддерживает списки и наборы изначально.


Я бы использовал SQL для хранения данных реляционно, используя правила нормализации.Используйте нереляционные методы в каждом конкретном случае для повышения производительности для конкретных высокоприоритетных запросов - ПОСЛЕ вы использовали профилирование, чтобы измерить и доказать, где на самом деле находятся ваши узкие места (избегайте преждевременной оптимизации).

В качестве нереляционных решений я считаю следующее:

  • Денормализация
  • Индексация (знаете ли вы, что в стандарте SQL индексы вообще не упоминаются?)
  • Кэширование
  • Хранилища данных NoSQL

Чем больше инструментов у вас в наборе инструментов, тем более гибкими вы сможете реагировать на проблемы с производительностью.

...