Ищете предложения по оптимизации API - PullRequest
2 голосов
/ 12 сентября 2011

В прошлом я задавал несколько вопросов о том, как создать свой собственный API, чтобы разрешить внешним сайтам доступ к моей базе данных, которую я храню в базе данных.Этот конкретный вопрос я спрашиваю, как оптимизировать доступ к API для внешних сайтов, чтобы снизить нагрузку на локальный сервер.Первый способ настройки API - это использование MySQL, который хранит данные и php для обслуживания данных.Сам API вызывается URL-адресом с ключом API в URL-адресе.Например:

http://mysite.com/get_listings.php?key=somekey

Затем мой сценарий делает то, что ему нужно для вышеуказанного действия, а затем возвращает результаты в формате json.В настоящее время API обслуживает 10–15 тыс. Уникальных вызовов в месяц, и я добавляю еще одну группу сайтов, которая будет приносить еще 20–30 тыс. Уникальных вызовов в месяц сверх того, что обслуживает API.Кэширование не происходит, это просто прямой вызов моего API через скрипт php, и он запрашивает базу данных MySQL при каждом вызове.Тип данных, которые он возвращает, - это, в основном, истории и информация профиля, а вызовы - это последние истории, профиль автора истории и детали истории.

Помимо обычной оптимизации php-кода и оптимизации запросов и индексов MySQLМожете ли вы предложить какие-либо другие методы оптимизации, которые могут помочь снизить нагрузку на сервер и при этом быстро обслуживать API для внешних сайтов?Я понимаю, что внешние сайты сами должны выполнять своего рода кэширование.Но с моей стороны, вы предлагаете кэшировать результаты из базы данных, а затем обслуживать кеш?Если так, то будет ли использование memcache хорошим выбором?Или, возможно, сохранение результатов JSON в Redis?Или, возможно, будет работать простая система кеширования файлов?Что-нибудь кроме кеширования?Очевидно, что серверное оборудование может иметь значение, но выходит за рамки этого поста.Однако я скажу, что получу совершенно новый сервер, который будет выделен только для этого.

У меня есть root-доступ для установки дополнительного программного обеспечения, если это поможет.

1 Ответ

3 голосов
/ 12 сентября 2011

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

  1. https://github.com/nicolasff/phpredis - установите это, это поможет вам легко взаимодействовать с Redis из PHP.
  2. Классифицируйте ваши запросы по определенным ключам. Например, get_listings.php? Key = somekey, вероятно, будет использовать $ redis-> hget ('lists', $ somekey);
  3. Хранить результаты сериализовано или в формате JSON.
  4. При обновлении базы данных обязательно уничтожьте или обновите соответствующие индексы в Redis. Если вы используете серверную часть с MVC, то обработчики поведения модели могут сделать это за вас. Например, при публикации нового комментария обновите отсортированный список Redis.
  5. Вы можете смешивать и сочетать различные структуры. Например, извлеките ключ из отсортированного списка, затем извлеките фактические данные из хеша.

Если вы используете redis для постоянного хранения, убедитесь, что ваш PHP знает, как его очистить. По моему опыту, он оказался довольно устойчивым, хотя я все еще храню данные в MySQL.

Redis отлично подходит, если вы понимаете сложности вычислений .

...