кэширование в памяти на сервере

Я хочу записать веб-приложение с клиентом JavaScript и сервер бэкэнда (Python). Клиенту нужны данные из сервера часто в Ajax путь. Данные в DB, и дорогой для загрузки для каждого запроса.

Однако в настольном приложении я просто загрузил бы данные из DB однажды к памяти и затем получил бы доступ к нему. В веб-приложении - серверный код работает каждый раз за запросом, таким образом, я не могу сделать этого (каждое выполнение должно загрузиться от DB до памяти снова). Как это может работать? Сингл может обработать работавший сервер, или я должен использовать что-то другое здесь?

Пример похож на автоматическое заполнение здесь на stackoverflow для тегов - как это реализовано в сервере для быстрого кэширования/загрузки?


Интересно, является ли хранилище данных как memcached действительно хорошим подходом для автоматического заполнения? Как Вы представили бы ключи для частичных соответствий?

5
задан zaharpopov 24 March 2010 в 03:42
поделиться

5 ответов

Используйте кэш памяти или аналогичный инструмент

Каждый элемент в кеше имеет ключ, дату и время истечения срока действия

Вам необходимо сделать ключ полезным для вашего приложения. Типичный образец модели ключа - это Security.Domain.Query.QueryValue для наборов или Security.Domain.ID для отдельных объектов

, например.

ALL.Product.Q.Red - это набор из домена Products с использованием запроса Red для всех пользователей

Admin. Product.Q.Blu - это набор из домена Products с использованием запроса Blu только для пользователей Admin

ALL.Customer.O. 12345 - это граф одного объекта из Customer ID домена 12345 для всех пользователей

При необходимости вы также можете добавить форматы к ключу.

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

например Автозаполнение для поиска продуктов

  1. Запрос: http://server.com/product?q=gre&format=json
  2. Сервер генерирует ключ кэша памяти ALL.Product.Name.gre.json
  3. Запрос Memcache не работает
  4. Сгенерировать запрос SQL Выбрать идентификатор, имя, цену из продукта Где имя Как 'gre%'
  5. Форматировать результат в Json
  6. Сохранить результат в memcache
  7. Вернуть результат в браузер

и в следующий раз

  1. Запрос: http://server.com/product?q=gre&format=json
  2. Сервер генерирует ключ кэша памяти ALL.Product.Name.gre.json
  3. Запрос Memcache завершен успешно
  4. Возвращает результат в браузер

Секрет заключается в ключевой модели , которая работает для всех случаев использования memcache и не генерирует повторяющиеся ключи для различных задач. Не забудьте кодировать разделители в параметрах запроса (в примере ".")

6
ответ дан 14 December 2019 в 13:32
поделиться

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

0
ответ дан 14 December 2019 в 13:32
поделиться

Взгляните на memcached.

0
ответ дан 14 December 2019 в 13:32
поделиться

Вы можете посмотреть на другие серверы, такие как twisted, где вы настраиваете сервер, а сервер хранит данные в памяти. Если, например, у вас есть данные чата, которые не нужно сохранять бесконечно, а просто хранить в памяти, пока кто-то заинтересован в новых чатах. Сервер, такой как twisted, позволяет сохранять вещи в памяти так же, как и в настольном приложении. http://twistedmatrix.com/ - сайт сейчас не работает.

0
ответ дан 14 December 2019 в 13:32
поделиться

Попробуйте Redis ( http://code.google.com/p/redis/ )

Скопировано непосредственно из описания:

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

Кроме того, Redis довольно быстр !, 110000 SET / сек, 81000 GET / сек в Linux начального уровня.

0
ответ дан 14 December 2019 в 13:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: