Как django REST Framework работает с кешем и SQL запросами - PullRequest
0 голосов
/ 28 апреля 2020

Работая в настоящее время с DRF для моего проекта, я решил использовать систему кэширования (в данном случае REDIS), чтобы ограничить количество запросов SQL непосредственно к БД. Поэтому я видел / читал много страниц по этой теме c, но я не нашел своего ответа.

на веб-сайте DRF, они говорят о том, чтобы использовать cache_page с помощью декоратор @method_decorator. Хорошо, это работает правильно, но в заголовке HTTP появляется поле expiration_date, указывающее браузеру поместить в свой кэш всю страницу и ничего не запрашивать до конца срока годности. Так что, если время истечения около текущего времени + 5 минут, в течение 5 минут мы «живем» с кешем веб-браузера, и если что-то изменится в течение этих 5 минут, мы не сможем этого знать. Вы согласны с таким поведением этого декоратора?

Поскольку я хотел бы получать информацию о любых изменениях за это время, я обновляю свой код для кэширования всех необходимых SQL запросов. Вот так, если что-то изменится, я sh кеш и в следующий раз, я получу обновленные данные.

Вот легкий пример ModelViewSet:

queryset = MyModel.objects.all().select_related(...).prefeth_related(...)
cache.set('MyKey', queryset)
return queryset.filter(...).exclude(...)

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

Для следующего запроса моего ModelViewSet:

if 'MyKey' in cache:
    queryset = cache.get('MyKey')
    return queryset.filter(...).exclude(...)   # => at that step, the framework do a request to the DB !

Если кто-то может помочь мне понять, почему запрос SQL выполняется к БД, тогда как все в кеше?

Спасибо

...