2011-09-12 1 views
1

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

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

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

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

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

+0

50 тыс. В месяц это ничего. Не беспокойтесь об этом. –

+0

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

ответ

3

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

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

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

Redis замечательный, если вы понимаете computation complexities.

+0

Спасибо за информацию!Вопрос: есть ли шансы на «столкновения», когда сайты получают доступ к api, и мой код находится в процессе обновления записи redis с новыми данными? Также вы рекомендуете разрешать доступ api с помощью mysql или хранить эту информацию в redis? – John

+0

Redis использует блокировку и даже позволяет транзакции. Я бы предложил полностью исключить MySQL из ваших самых популярных API-интерфейсов, тогда это будет не бутылочная шее. Даже если вы держите кеш на минуту, это удивительно, гораздо эффективнее Redis. – romaninsh

+0

Хорошо, есть ли какие-то конкретные настройки, которые я должен настроить, чтобы оптимизировать redis дальше, чем вы рекомендуете? Или это довольно хорошо с настройками из окна? – John