Кэширование поиска Laravel

#laravel #search #eloquent

Вопрос:

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

Внутри формы «Новый заказ», когда вы начинаете вводить название пиццы (четыре сыра, курица, яда-яда), программа возвращает поиск по запросу, который выполняется каждые 2 нажатия клавиш с продуктами с аналогичным названием.

Вот поисковый запрос, довольно простой и простой:

     $pesquisa = json_decode($request->getContent(), true);
    $produtos = Produto::select('nome', 'valor')->where('nome', 'LIKE', '%'.$pesquisa.'%')->get();
    return response()->json($produtos);
 

Вот «проблема», с которой я сталкиваюсь: текущая база данных содержит около 50 элементов, и для получения возврата требуется около ~ 500 мс. Это на моей локальной машине, проблема становится немного больше, когда она фактически размещается на сервере, где она может увеличиться с ~500 мс до ~2 с, в зависимости от подключения пользователя.

В своем исследовании я слышал о кэшировании и о том, что оно может сократить или устранить необходимость в запросах (что уже было реализовано в списке «показать все размещенные заказы» и ДЕЙСТВИТЕЛЬНО снизило скорость загрузки), но я не знаю, можно ли кэшировать с помощью пользовательского поиска?

Первый вопрос: Как можно сохранить эти названия пиццы в кэше, все еще сортируя их на основе ввода пользователя?

Второй вопрос: Является ли такое кэширование «лучшим» способом ускорить вводимый пользователем поиск? Есть ли что-то еще, что я должен сделать в первую очередь? (Я слышал, что поиск по запросу «НРАВИТСЯ» самый медленный из всех возможных… должен ли я исследовать и попробовать другой тип?)

Все объяснения, советы и рекомендации будут высоко оценены! Спасибо!

Комментарии:

1. 500 мс для поиска в базе данных из 50 элементов-это слишком много. Может быть, тебе стоит сначала попытаться найти то, что занимает так много времени.

2. Какой движок базы данных вы используете? Например, MySQL, Postgres и т. Д

3. Как упоминал апокрифос, маловероятно, что 500 мс на локальном уровне являются проблемой базы данных, если вы используете основной компонент базы данных. Запрос базы данных, подобный этому, на локальном (по моему опыту), должен занять менее 10 мс. Если вы переместите это из базы данных в кэш, есть большая вероятность, что это не поможет. Чтобы ответить на ваши вопросы, вы можете использовать Cache::get() на основе пользовательского ввода. Но кэш обычно представляет собой пары ключ/значение, и вы уже должны знать ключ при поиске, поэтому он не идеален для подобного запроса, так как пользовательский ввод не будет точно соответствовать имени продукта.

4. Еще несколько советов.. некоторым может показаться очевидным сожаление. Используя вкладку Сеть инструментов разработчика браузера, убедитесь, что все 500 мс происходит на сервере, и это не обнаружение JavaScript, когда вы перестали печатать в течение 500 мс перед выполнением запроса (это обычная практика при поиске в реальном времени). Запустите запрос непосредственно в локальной базе данных, а не с PHP-сервера… если это проблема с базой данных, это может быть не проблема с запросом . Попробуйте выполнить запрос без выполнения запроса к базе данных, например, измените всю свою функцию на return response()->json([]); — посмотрите, по-прежнему ли это занимает ~500 мс.

Ответ №1:

Для кэширования вы можете использовать это

   $pesquisa = json_decode($request->getContent(), true);

  return Cache::remember($pesquisa, $seconds, function ()use($pesquisa) {
           $produtos = Produto::select('nome', 'valor')->where('nome', 'LIKE', '%'.$pesquisa.'%')->get();
           return response()->json($produtos);
   });
 

Запомнить навсегда также можно использовать вместо запомнить