Задать вопрос
@ff0xff

Как кэшировать данные выполнения sql запроса в symfony 4 + doctrine?

Доброе время суток, интересует такой вопрос:
В базе данных есть таблица A и таблица Б

Данные в таблице A обновляются очень часто, выборка их не ресурсоемка и всегда надо показывать актуальную таблицу пользователю, в таком случае Doctrine по умолчанию справляется хорошо кэшируя в файл только структуру таблицы.
Тут вопросов нет - все работает из коробки.

Но вот предположим в таблице Б выборка данных очень ресурсоёмкий процесс, обновляется такая таблица крайне редко, и пользователю можно показывать не самые актуальные данные.

Хотелось бы не изобретая велосипеда - то бишь стандартными средствами закэшировать таблицу Б в файл.
Не только ее структуру, но и результат выполнения sql запроса.
Что бы не приходилось делать выборку каждый раз.

Какие есть стандартные решения по таблице Б - обратите внимание что таблица А подобным образом кэшироватся не должна.

Использую связку symfony 4 + doctrine

PS: Любителям отвечать не по теме, не надо писать про то что таблицу можно оптимизировать, я не тупой, я все это знаю, вопрос конкретно про управление кэшем, в этом суть вопроса я хочу услышать про кэш а не про то что надо оптимизировать таблицу!
  • Вопрос задан
  • 2536 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@dosim86
Можете предварительно настроить кеширование в Symfony для Doctrine:
framework:
    cache:
        pools:
            doctrine.result_cache_pool:
                adapter: cache.app
services:
    doctrine.result_cache_provider:
        class: Symfony\Component\Cache\DoctrineProvider
        public: false
        arguments:
        - '@doctrine.result_cache_pool'
doctrine:
    orm:
        result_cache_driver:
            type: service
            id: doctrine.result_cache_provider

По умолчанию Symfony использует файловое кеширование для пользовательских данных, поэтому результаты запроса Doctrine также будут хранится в файле. Однако если, например используете Redis, то можно его указать в качестве хранилища кешей по умолчанию:
framework:
    cache:
        # Redis
        app: cache.adapter.redis
        default_redis_provider: '%env(REDIS_URL)%'

Далее в нужных запросах просто указывайте Doctrine-е, что результат запроса надо кешировать:
...
->getQuery()
->useResultCache(true) // кешировать результат данного запроса
//->setResultCacheLifetime(3600) // время жизни кеша при необходимости
->getResult()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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