LINUX.ORG.RU

А подскажите как лучше реализовать кеширование

 , , , ,


0

2

Получаем от пользователя запрос. С помощью магии получаем кучу json'a по запросу. Иногда это может занимать 2-3 секунды, а иногда и до 10 подскакивает. Я так подумал, что не плохо бы кешировать результаты запросов хотя бы на 15 минут. Как показывает практика, пользователь может легко 2-3 раза послать один и тот же запрос.

Ближе к делу - есть БД MySQL. Вот что я выдумал:

  • Создать таблицу cache, c полями: id, search_text, datetime. id - все понятно, search_text - текст запроса, datetime - дата и время запроса
  • У этой таблицы - создать подчиненную, со следующими полями: cache_id, source, json. cache_id - указываем, какому запросу принадлежит строка, source - источник данных, json - результат. Источников может быть много, по этому, одному запросу может принадлежать много результатов

Но мне кажется, это не оптимальный вариант, в силу ряда причин:

  • Что делать, если несколько пользователей одновременно вбивают один и тот же запрос? Если записи в кеше нет, то пойдут запросы от всех пользователей. Мне кажется, можно решить эту проблему внедрив некий «state» для кеша. Например, state_fetch - ожидание получения результатов, state_received - данные получены и готовы к использованию. Соответственно, при запросе проверять этот state, если идет получение - ждать. Но и это не оптимальный вариант, что если данные так и не пришли? Мало ли че там на стороне будет.
  • Нужно контролировать актуальность данных. Как лучше это реализовать? Перед каждым запросом чистить базу от старых данных? Не медленно ли получится?

В общем, поможите, товарищи.

Deleted

Последнее исправление: Bizun (всего исправлений: 3)

man memcached / redis / etc

Но мне кажется, это не оптимальный вариант, в силу ряда причин:

man уровни кэша

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

man актуальный кэш

znenyegvkby
()
Ответ на: комментарий от Deleted

Если совсем в этом не шаришь, лучше не городить велосипед, а взять связку готовых решений. У тебя в тэгах php стоит. Берешь свой любимый фреймворк - симфони/yii/etc, подключаешь модуль кэша (лучше поставить конечно memcached/redis/etc, чтобы не файловый) и вперед. Если назовешь конкретный фрейм, тебе тут и с примером подскажут :)

znenyegvkby
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.