@mcakaneo
Я люблю пиццу

Как выборочно удалить устаревшие кэшированные результаты из базы данных?

Допустим в классе UserRepository есть методы:
findByFirstname($firstname)
findByCity($city)
findByAge($minAge, $maxAge)

Также, допустим, есть PostRepository с методом:
findByUser($id)
findByName($postName)

Допустим все эти методы уже выполнялись и результаты их выполнения уже находятся в кэше. При этом стоит заметить, что, например, если метод findByCity() выполнился несколько раз с разными параметрами, то соответственно после каждого выполнения в кэш добавлялся новый результат.

Допустим пользователь(User) удаляет свою учётную запись, а вместе с ней удаляются его посты(не знаю можно ли так делать, но суть не в этом). Теперь нужно удалить результаты из кэша, в которых присутствует этот пользователь, чтобы никто не получил устаревшие данные. Но как это правильно сделать? Есть ли в Doctrine такая функциональность, чтобы из кэша автоматически удалялись только те результаты, в которых присутствует этот пользователь, которого уже не существует?
Я знаю, что в Doctrine есть QueryBuilder, который и используется в методах выше. Этот объект строит запрос в базу данных и возвращает объект запроса(Query), у которого можно вызвать метод useResultCache() и передать в этот метод ID, по которому потом можно удалить из кэша результат(ы) этого запроса. Я знаю, что можно разным запросам(объектам Query) передавать в useResultCache() один и тот же ID и удалять из кэша все результаты этих запросов по этому ID.
Я использовал EventManager и создал слушателя, метод которого срабатывает после отработки EntityManager::flush(), но печаль в том, что логику удаления нужно писать самому, то есть смотреть какая entity была сохранена, удалена или обновлена и на основе этой информации удалять определённые результаты из кэша, которые содержат устаревшие данные. Я сомневаюсь что Doctrine сама может с этим разобраться, но может есть какие-то способы, которые облегчают это?

И еще очень важная деталь: допустим в кэше находятся 2 разных результата, которые возвратил метод findByCity(), в первом результате, который возвратил метод findByCity( 'Moscow'), находится User, который уже на самом деле удалён, а во втором результате, который возвратил метод findByCity( 'Kyev'), этого User нет, ведь он из Москвы. То есть второй результат удалять не нужно, в нём нет несуществующего User, а значит нет и устаревших данных.
Но чтобы выборочно удалить только те результаты, которые точно содержат устаревшие данные, нужно проверить находится ли в них удалённый User. Это всё слишком гемморно, поэтому мне кажется, что лучше таких проверок не делать, а просто удалять все результаты, которые потенциально могут содержать устаревшие данные. Но даже это кажется мне слишком неприятным делом, которое займёт много времени и в котором можно допустить кучу ошибок.

Если есть литература или статья где об этом адекватно написано, то подскажите такую. Я вот нашел такую статью https://www.gregfreeman.io/2012/invalidating-the-r... пока еще не опробовал, ведь еще надеюсь, что есть способы получше.
  • Вопрос задан
  • 95 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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